問(wèn)題描述
有沒(méi)有什么技巧可以讓 Win Jenkins slave 使用 chromedriver?
Is there a trick to getting Win Jenkins slave to be OK with chromedriver?
我的測(cè)試從 maven 存儲(chǔ)庫(kù)中提取 chromedriver 和便攜式 chrome,然后執(zhí)行它們.在我的本地以及當(dāng)我的構(gòu)建用戶在我的構(gòu)建系統(tǒng)上執(zhí)行相同操作時(shí)工作正常.
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.
當(dāng) jenkins 做同樣的事情時(shí),即使在前臺(tái)(不是 svc)運(yùn)行時(shí),它也會(huì)失敗并出現(xiàn)以下錯(cuò)誤.我嘗試通過(guò)參數(shù)來(lái)提高詳細(xì)程度,但無(wú)濟(jì)于事.
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:未知錯(cuò)誤:Chrome 啟動(dòng)失敗:正常退出(驅(qū)動(dòng)程序信息:chromedriver=2.23.409699 (49b0fa931cda1caad0ae15b7d1b68004acd05129),platform=Windows NT 6.1.7601 SP1 x86_64)(警告:服務(wù)器未提供任何堆棧跟蹤信息)命令持續(xù)時(shí)間或超時(shí):62.63 秒構(gòu)建信息:版本:'2.41.0',修訂:'3192d8a6c4449dc285928ba024779344f5423c58',時(shí)間:'2014-03-27 11:29:39'系統(tǒng)信息:主機(jī):'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'驅(qū)動(dòng)程序信息:org.openqa.selenium.chrome.ChromeDriver在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)在 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)
我是這樣設(shè)置 Chrome 驅(qū)動(dòng)的:
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;
}
}
推薦答案
我們有幾個(gè)問(wèn)題,關(guān)鍵似乎是 Chrome 的無(wú)沙盒選項(xiàng).下面是一個(gè)適用于桌面和在前臺(tái)或通過(guò)服務(wù)運(yùn)行的 jenkins slave 的解決方案.
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.
第一部分:Maven 解包 Chrome &司機(jī)
- 下載 PortableApps GoogleChrome
- 安裝
- 將目錄重命名為通用名稱 (GoogleChrome)
- 壓縮目錄
- 添加到存儲(chǔ)庫(kù)管理器
設(shè)置 maven-dependency-plugin 執(zhí)行以解包
- 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>
結(jié)果在測(cè)試執(zhí)行時(shí),我們有 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 配置
我們?yōu)轵?qū)動(dòng)程序和 chrome exe 的位置設(shè)置系統(tǒng)屬性以傳遞給所有單元測(cè)試
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>
第三部分:測(cè)試代碼
我們使用 chrome 驅(qū)動(dòng)程序服務(wù)構(gòu)建器將詳細(xì)程度設(shè)置為 11,并使用我們最喜歡的功能啟動(dòng)驅(qū)動(dòng)程序
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
" + source,
source.contains("DOCTYPE"));
driver.quit();
service.stop();
}
}
這篇關(guān)于chromedriver 在前臺(tái)運(yùn)行的 windows jenkins slave 上失敗的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!