代码之家  ›  专栏  ›  技术社区  ›  Jitendra Jangid

无法通过Heroku中的Selenium webdriver(Java)调用headless chrome驱动程序

  •  1
  • Jitendra Jangid  · 技术社区  · 7 年前

    我在heroku环境中调用headless 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环境添加的条件很少。

    提前感谢!!!

    1 回复  |  直到 7 年前
        1
  •  5
  •   quantumThinker Jitendra Jangid    7 年前

    先前(&P);发布此问题后,投入大量时间解决此问题。我很高兴地说,我们取得了成功。

    解决方案:

    我已指定驱动程序路径(在脚本中)(&在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中设置“selenium webdriver java脚本调用Headless chrome”的整个方法:

    将以下构建包添加到hero应用程序

    heroku/爪哇

    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