chromedriver在前台运行的Windows jenkins从属服务器上失败 [英] chromedriver fails on windows jenkins slave running in foreground

查看:114
本文介绍了chromedriver在前台运行的Windows jenkins从属服务器上失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以通过chromedriver使Win Jenkins从站正常运行?

Is there a trick to getting Win Jenkins slave to be OK with chromedriver?

我的测试从Maven存储库中提取chromedriver和便携式chrome,然后执行它们.在本地和当构建用户在构建系统上执行相同操作时,都可以正常工作.

My tests pull chromedriver and portable chrome from a maven repo and then execute them. The work fine on my local and when my build users does the same on my build systems.

当詹金斯做同样的事情时,即使在前台运行(不是svc),它也会失败,并显示以下错误.我尝试传递参数以提高详细程度,但无济于事.

When jenkins does the same thing, even when running in the foreground (not a svc) it fails with the error below. I've tried passing params to boost the verbosity to no avail.

org.openqa.selenium.WebDriverException:未知错误:Chrome无法启动:正常退出 (驱动程序信息:chromedriver = 2.23.409699(49b0fa931cda1caad0ae15b7d1b68004acd05129),平台= Windows NT 6.1.7601 SP1 x86_64)(警告:服务器未提供任何堆栈跟踪信息) 命令持续时间或超时:62.63秒 内部版本信息:版本:"2.41.0",修订版:"3192d8a6c4449dc285928ba024779344f5423c58",时间:"2014-03-27 11:29:39" 系统信息:主机:'winengbld15',ip:'10 .2.2.105',os.name:'Windows Server 2008 R2',os.arch:'amd64',os.version:'6.1',java.version:'1.8 .0_40' 驱动程序信息:org.openqa.selenium.chrome.ChromeDriver 在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)处 在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在java.lang.reflect.Constructor.newInstance(Constructor.java:422) 在org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:193) 在org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145) 在org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:595) 在org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:240) 在org.openqa.selenium.chrome.ChromeDriver.startSession(ChromeDriver.java:181) 在org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:126) 在org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:139) 在org.openqa.selenium.chrome.ChromeDriver.(ChromeDriver.java:160) 在org.openqa.selenium.chrome.ChromeDriver.(ChromeDriver.java:128)

org.openqa.selenium.WebDriverException: unknown error: Chrome failed to start: exited normally (Driver info: chromedriver=2.23.409699 (49b0fa931cda1caad0ae15b7d1b68004acd05129),platform=Windows NT 6.1.7601 SP1 x86_64) (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 62.63 seconds Build info: version: '2.41.0', revision: '3192d8a6c4449dc285928ba024779344f5423c58', time: '2014-03-27 11:29:39' System info: host: 'winengbld15', ip: '10.2.2.105', os.name: 'Windows Server 2008 R2', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_40' Driver info: org.openqa.selenium.chrome.ChromeDriver at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:193) at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:595) at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:240) at org.openqa.selenium.chrome.ChromeDriver.startSession(ChromeDriver.java:181) at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:126) at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:139) at org.openqa.selenium.chrome.ChromeDriver.(ChromeDriver.java:160) at org.openqa.selenium.chrome.ChromeDriver.(ChromeDriver.java:128)

我通过以下方式设置了Chrome驱动程序:

I setup the Chrome driver thus:

defaultPath = "target/drivers/chromedriver.exe";
System.setProperty("webdriver.chrome.driver", defaultPath);
ChromeLocator locator = new ChromeLocator();
driver = new ChromeDriver(locator.getCapabilities());

public class ChromeLocator {
  private static final Logger log = Logger.getLogger(ChromeLocator.class);

  /**
   * Obtain Chrome Configuration with location of binary
   * @return
   * @throws IOException 
   */
  public DesiredCapabilities getCapabilities() throws IOException {
    Map<String, Object> chromeOptions = new HashMap<String, Object>();
    chromeOptions.put("binary", getChromeExecutableLocation().getAbsolutePath());

    DesiredCapabilities capabilities = DesiredCapabilities.chrome();
    capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);

    return capabilities;
  }

  // Windows defaults to unpacked location
  private File getChromeExecutableLocation() throws IOException {

    File chromeExe;

    if (SystemUtils.IS_OS_WINDOWS) {
      chromeExe = new File(System.getProperty("win.google.chrome.bin"));  
      log.info("*** win.google.chrome.bin: " + System.getProperty("win.google.chrome.bin"));
    } else {
      // Use the standard locator option for all other operating systems
      GoogleChromeLocator locator = new GoogleChromeLocator();
      BrowserInstallation installation = locator.findBrowserLocationOrFail();
      chromeExe = new File(installation.launcherFilePath());
    }
    log.info("Chrome Exe: " + chromeExe.getAbsolutePath() + " Is File: " + chromeExe.isFile());
    if (! chromeExe.exists() || ! chromeExe.isFile()) {
      throw new IOException("Cannot locate Chrome Executable.  Expected Location: " + chromeExe.getAbsolutePath());
    }
    return chromeExe;
  }
}

推荐答案

我们遇到了几个问题,关键似乎是Chrome的无沙箱选项.下面是一个可在桌面和在前台或通过服务运行的jenkins从站上运行的解决方案.

We have several issues and the key seems to be the no-sandbox option to Chrome. Below is a solution that works on the desktop and on a jenkins slave running in the foreground or via service.

第一部分:Chrome和Mamp的Maven拆包驱动程序

  • 下载Google Chrome浏览器的PortableApps
  • 安装
  • 将目录重命名为通用名称(GoogleChrome)
  • 邮编目录
  • 添加到资源库管理器
  • 设置maven-dependency-plugin执行以解压缩

  • Download PortableApps GoogleChrome
  • Install
  • Rename dir to generic name (GoogleChrome)
  • Zip dir
  • add to repository manager
  • setup maven-dependency-plugin executions to unpack

  <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
 <execution>
   <id>extract portable google chrome</id>
   <phase>process-test-resources</phase>
   <goals>
     <goal>unpack</goal>
   </goals>
   <configuration>
     <skip>${skipWinChromeUnpack}</skip>
     <markersDirectory>${project.build.directory}/dependency-maven-plugin-markers/googlechrome</markersDirectory>
     <overWriteIfNewer>false</overWriteIfNewer>
     <artifactItems>
       <artifactItem>
          <groupId>com.google.chromium</groupId>
          <artifactId>chromedriver</artifactId>
          <version>${win.chromedriver.version}</version>                
          <classifier>win32</classifier>
          <type>zip</type>
        <outputDirectory>${project.build.directory}</outputDirectory>
       </artifactItem>
       <artifactItem>
          <groupId>com.portableapps</groupId>
          <artifactId>googlechrome</artifactId>
          <version>${win.chrome.version}</version>
          <classifier>win64</classifier>
          <type>zip</type>
        <outputDirectory>${project.build.directory}</outputDirectory>
       </artifactItem>
     </artifactItems>
   </configuration>
 </execution>         


结果 在测试执行时,我们有要使用的target/chromedriver.exe和target/GooglePortable/Google ... exe文件

Result At test execution time we have target/chromedriver.exe and target/GooglePortable/Google...exe files to use

第二部分:Maven Surefire配置

我们为驱动程序和chrome exe的位置设置了系统属性,以传递给所有单元测试

We set System properties for location of driver and chrome exe to pass down to all unit tests

        <systemPropertyVariables>
          <webdriver.chrome.driver>${project.build.directory}/chromedriver.exe</webdriver.chrome.driver>
          <win.google.chrome.bin>${win.chrome.exe}</win.google.chrome.bin>  
        </systemPropertyVariables>

第三部分:测试代码

我们使用chrome驱动程序服务构建器将详细程度设置为11,并使用我们最喜欢的功能启动驱动程序

We use chrome driver service builder to set verbosity to 11 and start the driver using our favorite capabilities from that

public class ChromeLocator {
    private static final Logger log = Logger.getLogger(ChromeLocator.class);

/**
 * Obtain Chrome Configuration with location of binary
 * @return
 * @throws IOException
 */
public DesiredCapabilities getCapabilities() throws IOException {
    ChromeOptions chromeOptions = new ChromeOptions();
    chromeOptions.setBinary(getChromeExecutableLocation().getAbsolutePath());
    chromeOptions.addArguments("no-sandbox");
    DesiredCapabilities capabilities = DesiredCapabilities.chrome();
    capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);


    return capabilities;
}

// Windows defaults to unpacked location
private File getChromeExecutableLocation() throws IOException {

    File chromeExe;

    if (SystemUtils.IS_OS_WINDOWS) {
        chromeExe = new File(System.getProperty("win.google.chrome.bin"));
    } else {
        // Use the standard locator option for all other operating systems
        GoogleChromeLocator locator = new GoogleChromeLocator();
        BrowserInstallation installation = locator.findBrowserLocationOrFail();
        chromeExe = new File(installation.launcherFilePath());
    }
    System.out.println("Chrome Exe: " + chromeExe.getAbsolutePath() + " Is File: " + chromeExe.isFile());
    if (! chromeExe.exists() || ! chromeExe.isFile()) {
        throw new IOException("Cannot locate Chrome Executable.  Expected Location: " + chromeExe.getAbsolutePath());
    }
    return chromeExe;
}

}

public class WebTest

{
static ChromeDriverService service = null;
static WebDriver driver = null;

@BeforeClass
static public void setupOnce() throws IOException {

    // Setup ChromeDriver with Verbosity on - perhaps control via system property - off by default?
    service = new ChromeDriverService.Builder()
            .withVerbose(true)
            .usingAnyFreePort()
            .build();

    service.start();

    // Setup locator to find unpacked Portable chrome exe
    ChromeLocator locator = new ChromeLocator();

    // Use service + capabilities from locator to open driver with settings and chrome bin
    driver = new RemoteWebDriver(service.getUrl(), locator.getCapabilities());
}

@AfterClass
static public void teardownOnce() {
    if (null != service) {
        service.stop();
        service = null;
    }
}
@Test
public void testGoogleSearch() throws InterruptedException, IOException {
    driver.get("http://www.google.com/xhtml");
    assertEquals("Google", driver.getTitle());

    WebElement searchBox = driver.findElement(By.name("q"));
    String searchString = "ChromeDriver";
    searchBox.sendKeys(searchString);
    searchBox.submit();

    String source = driver.getPageSource().toString();
    assertTrue("Expected DOCTYPE in\n" + source,
            source.contains("DOCTYPE"));
    driver.quit();
    service.stop();

}

}

这篇关于chromedriver在前台运行的Windows jenkins从属服务器上失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆