Seleniumとtestngを使用した基本的なログインテストがあります。 Eclipseから実行すると、期待どおりに動作し、Google Chromeを呼び出します。 TESTNGコマンドラインから実行した場合も、正常に機能します。
これは私の@Beforeです。
@BeforeMethod
public void setUp() throws Exception {
File file = new File("C:/Selenium-driver/chromedriver.exe");
System.setProperty("webdriver.chrome.driver", file.getAbsolutePath());
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
ただし、ジェンキンスを通じて同じテストを実行すると、次のようになります。
Building in workspace C:\EclipsePortable\Data\workspace\GS_TESTNG
[G_TESTNG] $ cmd /c call C:\Windows\TEMP\hudson9049518275115936054.bat
C:\EclipsePortable\Data\workspace\G_TESTNG>_test_login_cmd.bat
C:\EclipsePortable\Data\workspace\G_TESTNG>cd C:\EclipsePortable\Data\workspace\G_TESTNG
C:\EclipsePortable\Data\workspace\G_TESTNG>Java -cp C:\EclipsePortable\Data\workspace\G_TESTNG\lib\*;C:\EclipsePortable\Data\workspace\G_TESTNG\bin org.testng.TestNG testng.xml
...
... TestNG 6.9.9 by Cédric Beust ([email protected])
...
[TestNG] Running:
C:\EclipsePortable\Data\workspace\G_TESTNG\testng.xml
Starting ChromeDriver 2.26.436362 (5476ec6bf7ccbada1734a0cdec7d570bb042aa30) on port 36257
Only local connections are allowed.
FAILED CONFIGURATION: @BeforeMethod setUp
org.openqa.Selenium.WebDriverException: unknown error: cannot find Chrome binary
(Driver info: chromedriver=2.26.436362 (5476ec6bf7ccbada1734a0cdec7d570bb042aa30),platform=Windows NT 6.1.7601 SP1 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 664 milliseconds
Build info: version: '2.51.0', revision: '1af067d', time: '2016-02-05 19:15:17'
System info: Host: 'NMTLA12810', ip: '192.168.0.179', os.name: 'Windows 7', os.Arch: 'AMD64', os.version: '6.1', Java.version: '1.8.0_102'
Driver info: org.openqa.Selenium.chrome.ChromeDriver
at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at Sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at Java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.openqa.Selenium.remote.ErrorHandler.createThrowable(ErrorHandler.Java:206)
at org.openqa.Selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.Java:158)
at org.openqa.Selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.Java:678)
at org.openqa.Selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.Java:249)
at org.openqa.Selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.Java:131)
at org.openqa.Selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.Java:144)
at org.openqa.Selenium.chrome.ChromeDriver.<init>(ChromeDriver.Java:170)
at org.openqa.Selenium.chrome.ChromeDriver.<init>(ChromeDriver.Java:159)
at org.openqa.Selenium.chrome.ChromeDriver.<init>(ChromeDriver.Java:116)
at com.test.TestA.setUp(TestA.Java:33)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at Java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.Java:85)
at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.Java:510)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.Java:211)
at org.testng.internal.Invoker.invokeMethod(Invoker.Java:585)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.Java:816)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.Java:1124)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.Java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.Java:108)
at org.testng.TestRunner.privateRun(TestRunner.Java:774)
at org.testng.TestRunner.run(TestRunner.Java:624)
at org.testng.SuiteRunner.runTest(SuiteRunner.Java:359)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.Java:354)
at org.testng.SuiteRunner.privateRun(SuiteRunner.Java:312)
at org.testng.SuiteRunner.run(SuiteRunner.Java:261)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.Java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.Java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.Java:1215)
at org.testng.TestNG.runSuitesLocally(TestNG.Java:1140)
at org.testng.TestNG.run(TestNG.Java:1048)
at org.testng.TestNG.privateMain(TestNG.Java:1355)
at org.testng.TestNG.main(TestNG.Java:1324)
SKIPPED CONFIGURATION: @AfterClass tearDown
SKIPPED: testGooglePageTitleInChrome
===============================================
TestNG Test Group
Tests run: 1, Failures: 0, Skips: 1
Configuration Failures: 1, Skips: 1
===============================================
===============================================
Main Test Suite
Total tests run: 1, Failures: 0, Skips: 1
Configuration Failures: 1, Skips: 1
===============================================
[TestNG] Time taken by org.testng.reporters.JUnitReportReporter@7fbe847c: 16 ms
[TestNG] Time taken by org.testng.reporters.jq.Main@759ebb3d: 78 ms
[TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@ba8a1dc: 59 ms
[TestNG] Time taken by org.testng.reporters.XMLReporter@1c655221: 5 ms
[TestNG] Time taken by org.testng.reporters.EmailableReporter2@1edf1c96: 16 ms
[TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 0 ms
Build step 'Exécuter une ligne de commande batch Windows' marked build as failure
Finished: FAILURE
chromeがAppDataにインストールされている可能性があります(特にWindows 7の場合)。Jenkinsはユーザーディレクトリからバイナリにアクセスできなかったと思います。 Chrome on、Jenkinsからアクセス可能、またはプログラムファイルディレクトリにchromeを再インストールしてください。
一方、ChromedriverにChrome Binary、
ChromeOptions chromeOptions= new ChromeOptions();
chromeOptions.setBinary("C:\\ThePAthtoChrome.exe");
ChromeDriver driver = new ChromeDriver(chromeOptions);
問題は、コード内の次の行です。
File file = new File("C:/Selenium-driver/chromedriver.exe");
System.setProperty("webdriver.chrome.driver", file.getAbsolutePath());
これは私が定期的に見ている大規模なアンチパターンです。 webdriver.chrome.driver
環境変数は、異なる場所の複数のシステムにchromedriverバイナリをインストールし、各システムで環境変数を設定できるように設計されているため、そのシステムでSeleniumテストが実行されると、バイナリ。
この環境変数をコードでハードコーディングすると、ビルドエージェントのビルド時に設定された事前構成済みの環境変数は無視され、意図したとおりに使用されません。
この方法でそれを行うことを主張する場合は、設定する前にenv変数が既に設定されているかどうかを常に確認する必要があります。この方法では、既存のenv変数は上書きされません。また、ハードコーディングしたファイルパスがビルドエージェントに存在することを確認する必要があります(エラーの2番目の原因は、そうではないことです)。したがって、env変数が設定されていない場合、実際にchromedriverバイナリへの有効なパス。
私は同じ問題を抱えていました。ローカルからSeleniumスクリプトを実行できましたが、Jenkinsで実行しようとすると「不明なエラー:Chromeバイナリが見つかりません」というエラーが発生しました。
Jenkinsサーバーで動作する私のソリューションを次に示します。1. JenkinsでSeleniumスクリプトを開始する前にXvfbをダウンロードして有効にします。詳細については、こちらをご覧ください https://wiki.jenkins.io/display/JENKINS/Xvfb+Plugin 2. ubuntu 16.xx osを使用していますローカルおよびジェンキンスサーバー上。 3. chromedriverを「usr/bin」フォルダーに保存するようにしてください。そうしないと、エラーが発生する可能性があります。
try {
if(service == null){
service = new ChromeDriverService.Builder()
.usingDriverExecutable(new File("/usr/bin/chromedriver"))// set the chromedriver path
.usingAnyFreePort()
.withEnvironment(ImmutableMap.of("DISPLAY", ":15"))
.withSilent(true)
.build();
service.start();
}
System.out.println("Reading chrome driver");
System.setProperty("webdriver.chrome.driver","/usr/bin/chromedriver");
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
WebDriver driver = new ChromeDriver(chromeOptions);
driver.get("https://google.com");
driver.quit();
}
catch(Exception ex){
System.out.println(ex.getMessage());
}
インスタンスにchromeをインストールする必要があると思います。そのためには、この基本的なコマンドに従います
wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
Sudo yum install ./google-chrome-stable_current_*.rpm
google-chrome &