簡體   English   中英

無法通過 Heroku 中的 Selenium webdriver(Java) 調用無頭 chrome 驅動程序

[英]Unable to invoke headless chrome driver through Selenium webdriver(Java) in Heroku

我在 heroku 環境中調用無頭 chrome 並在 WINDOWS(本地機器)中完美運行時遇到了一個問題。

錯誤:

 2018-02-07T05:37:22.412428+00:00 heroku[web.1]: Starting process with command `java -cp target/classes:target/dependency/* com.appirio.sd.TestScript` 2018-02-07T05:37:24.211467+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will override them.

 2018-02-07T05:37:24.219616+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx300m -Xss512k -Dfile.encoding=UTF-8
 2018-02-07T05:37:24.381460+00:00 app[web.1]: Invoke Browser
 2018-02-07T05:37:24.503816+00:00 app[web.1]: Path: /app/.apt/usr/bin/google-chrome-stable
 2018-02-07T05:37:24.503854+00:00 app[web.1]: Driver Path: agent//chromedriver
 2018-02-07T05:37:24.650636+00:00 app[web.1]: Exception in thread "main" java.lang.IllegalStateException: The driver is not executable: /app/agent/chromedriver
 2018-02-07T05:37:24.650644+00:00 app[web.1]:    at com.google.common.base.Preconditions.checkState(Preconditions.java:534)
 2018-02-07T05:37:24.650650+00:00 app[web.1]:    at org.openqa.selenium.chrome.ChromeDriverService.access$000(ChromeDriverService.java:32)
 2018-02-07T05:37:24.650647+00:00 app[web.1]:    at org.openqa.selenium.remote.service.DriverService.checkExecutable(DriverService.java:140)
 2018-02-07T05:37:24.650655+00:00 app[web.1]:    at org.openqa.selenium.remote.service.DriverService$Builder.build(DriverService.java:339)
 2018-02-07T05:37:24.650649+00:00 app[web.1]:    at org.openqa.selenium.remote.service.DriverService.findExecutable(DriverService.java:131)
 2018-02-07T05:37:24.650653+00:00 app[web.1]:    at org.openqa.selenium.chrome.ChromeDriverService$Builder.findDefaultExecutable(ChromeDriverService.java:137)
 2018-02-07T05:37:24.650657+00:00 app[web.1]:    at org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(ChromeDriverService.java:88)
 2018-02-07T05:37:24.650658+00:00 app[web.1]:    at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:157)
 2018-02-07T05:37:24.650660+00:00 app[web.1]:    at com.appirio.commands.Selenium.launchBrowser(Selenium.java:42)
 2018-02-07T05:37:24.650663+00:00 app[web.1]:    at com.appirio.sd.TestScript.main(TestScript.java:12)
 2018-02-07T05:37:24.733915+00:00 heroku[web.1]: State changed from starting to crashed
 2018-02-07T05:37:24.717297+00:00 heroku[web.1]: Process exited with status 1

代碼截圖:

    public WebDriver launchBrowser(){
    String driverPath="";
    if(getOS().equals(OS.WINDOWS)){
        driverPath="agent//chromedriver.exe";
    }else if(getOS().equals(OS.LINUX)){
        driverPath="agent//chromedriver";
    }   

    ChromeOptions options = new ChromeOptions();
    options.addArguments("--headless");
    options.addArguments("window-size=1200x600");
    if(getOS().equals(OS.LINUX)){
        try{   //GOOGLE_CHROME_SHIM GOOGLE_CHROME_BIN
            String binaryPath=EnvironmentUtils.getProcEnvironment().get("GOOGLE_CHROME_SHIM");
            System.out.println("Path: "+binaryPath);
            options.setBinary(binaryPath);     
            options.addArguments("--disable-gpu");
            options.addArguments("--no-sandbox");       
        }catch(Exception e){

        }
    }      

    System.out.println("Driver Path: "+driverPath);

    System.setProperty("webdriver.chrome.driver", driverPath);
    WebDriver driver=new ChromeDriver(options);

    return driver;
} 

Heroku 是 Linux 環境,所以很少有專門為 Linux env 添加的條件。

提前致謝!!!

在發布這個問題之前和之后,投入了足夠的時間來解決這個問題。 我很高興地說它成功了。

解決方法:

我已經指定了驅動程序路徑(在腳本中)並在 heroku env 中添加了驅動程序構建包。 驅動程序路徑造成了問題。 因此,只需刪除以下類似 heroku env 的代碼並僅添加到 Windows

 System.setProperty("webdriver.chrome.driver", driverPath);

因此,代碼看起來像

public WebDriver launchBrowser(){
String driverPath="";
if(getOS().equals(OS.WINDOWS)){
    driverPath="agent//chromedriver.exe";
    System.setProperty("webdriver.chrome.driver", driverPath);
}  

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("window-size=1200x600");
if(getOS().equals(OS.LINUX)){
    try{   //GOOGLE_CHROME_SHIM GOOGLE_CHROME_BIN
        String binaryPath=EnvironmentUtils.getProcEnvironment().get("GOOGLE_CHROME_SHIM");
        System.out.println("Path: "+binaryPath);
        options.setBinary(binaryPath);     
        options.addArguments("--disable-gpu");
        options.addArguments("--no-sandbox");       
    }catch(Exception e){

    }
}    

WebDriver driver=new ChromeDriver(options);

return driver;
} 

總結一下在 Heroku 中設置“調用 Headless chrome 的 selenium webdriver java 腳本”的整個方法:

將以下構建包添加到英雄應用程序

Heroku/Java

https://github.com/heroku/heroku-buildpack-google-chrome

https://github.com/heroku/heroku-buildpack-chromedriver

在 heroku 應用程序中部署代碼

謝謝大家!

添加構建包的命令。

heroku buildpacks:set heroku/java
heroku buildpacks:add --index 1 https://github.com/heroku/heroku-buildpack-google-chrome
heroku buildpacks:add --index 2 https://github.com/heroku/heroku-buildpack-chromedriver

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM