当前位置: 首页 > 面试题库 >

在前台运行的Windows Jenkins从属设备上chromedriver失败

孙永嘉
2023-03-14
问题内容

使用chromedriver让Win Jenkins奴隶还可以吗?

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

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

org.openqa.selenium.WebDriverException:未知错误:Chrome无法启动:正常退出(驱动程序信息:chromedriver
= 2.23.409699(49b0fa931cda1caad0ae15b7d1b68004acd05129),platform = 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
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native方法)处的.selenium.chrome.ChromeDriver(位于sun.reflect.NativeConstructorAccessorImpl处)。org.openqa.selenium.remote.ErrorHandler上的java.lang.reflect.Constructor.newInstance(Constructor.java:422)上的sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)上的newInstance(NativeConstructorAccessorImpl.java:62)
org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)的org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:595)的.createThrowable(ErrorHandler.java:193)
org.openqa.selenium.chrome.ChromeDriver.startSession(ChromeDriver.java:181)上的openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:240)org.openqa.selenium.remote.RemoteWebDriver。(RemoteWebDriver.java
:126),位于org.openqa。selenium.remote.RemoteWebDriver。(RemoteWebDriver.java:139)。selenium.chrome.ChromeDriver。(ChromeDriver.java:160)位于org.openqa.selenium.chrome.ChromeDriver。(ChromeDriver.java:128)

我这样设置Chrome驱动程序:

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从属服务器上运行的解决方案

第一部分:Chrome和驱动程序的Maven解压缩

  • 下载PortableApps GoogleChrome
  • 安装
  • 将目录重命名为通用名称(GoogleChrome)
  • 邮编目录
  • 添加到存储库管理器
  • 设置Maven依赖插件执行以解压
          <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文件要使用

第二部分:Maven Surefire配置

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

        <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,然后使用我们最喜欢的功能启动驱动程序

    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让Win Jenkins奴隶还可以吗? 我的测试从Maven存储库中提取chromedriver和便携式chrome,然后执行它们。在本地和当构建用户在构建系统上执行相同操作时,工作正常。 当jenkins做同样的事情时,即使在前台运行(不是svc),它也会失败,并显示以下错误。我尝试传递参数来提高详细程度无济于事。 org.openqa.selenium.

  • 问题内容: 我正在尝试在pyinstaller的可执行文件中添加Chromedriver。虽然这是可能的,但似乎在尝试在另一台计算机上运行此错误消息。 我已经尝试了一些职位,包括本的一个,但不幸的是,这并没有提供预期的效果。最好的情况是,当chrome exe位于同一文件夹中时,我可以在自己的计算机上运行它,这无济于事。 代码1: 主程序 在另一台PC上运行时,我得到的是: 错误1: 找不到Chr

  • 我正在尝试使用python 3从WSL2(Ubuntu18.04)中无头打开Chrome。 在Windows上,我使用的是Chrome84。我已经从ChromeDriver-WebDriver下载了Chrome Driver 84。并在C:\chromedriver\chromedriver.exe下安装了。exe 以下是我的剧本: 它失败并出现错误: 引发WebDriverException(“

  • 我想在Android设备上运行一些需要根权限的命令。这些命令应该使用java代码执行,因此应用程序本身应该能够运行这些命令,而不需要将设备连接到个人电脑并使用shell运行这些命令。 我使用了,然后使用了我想要运行的命令(chmod 666)。chmod666需要一个根设备才能正常运行,因此我尝试先使用获得超级用户权限,然后尝试运行它。我将java代码放在onCreate方法中。这是我的密码: 但

  • 我正在使用axios软件包将API请求从我的应用程序发送到我的后端 后端使用Laravel构建,是一个简单的rest API 如果我使用在桌面上运行爱奥尼亚应用程序,它工作正常 如果我构建APK并安装应用程序: 在版本8或更低的Android设备上,它工作正常 在版本为9或以上的Android设备上,飞行前检查一直失败 (这是通过Chrome使用远程设备功能来检查应用程序的请求) 最初,请求甚至不

  • 我正在使用Windows8。我正在尝试在设备上运行应用程序。找不到我的设备,设备USB调试已启用。此外,我已经安装了相同的驱动程序使用管理我也安装了谷歌USB驱动程序包。但仍然找不到该设备。 拜托,有人能帮忙吗