使用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解压缩
<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驱动程序包。但仍然找不到该设备。 拜托,有人能帮忙吗