我有一个关于Vaadin应用程序的Selenium WebDriver测试。使用chromedriver,如果更准确地告诉它。在我的应用程序中,我有"播放演示"按钮,该按钮可在Chrome浏览器的新会话中启动应用程序并执行一些应用程序测试任务。
WebDriverManager.chromedriver().setup(); // am getting chromedriver with this WebDriverManager
// After that:
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
driver = new ChromeDriver(options);
driver.navigate().to("https://pazukdevtestapp1.herokuapp.com");
// Or so:
driver = new ChromeDriver();
driver.navigate().to("https://pazukdevtestapp1.herokuapp.com/#!Hotels");
当我从 localhost 启动应用程序时 - 测试开始并且与这两种代码变体都运行良好。没关系,单击按钮在本地主机上运行应用程序本身或 Heroku 服务器上的同一应用程序。 但是,如果尝试从服务器上的应用程序启动它,则它不起作用。知道为什么会这样吗?
PS 应用程序登录服务器:
2018-06-01T09:15:08.692373+00:00 app[web.1]: Jun 01, 2018 9:15:08 AM org.openqa.selenium.os.UnixProcess checkForError
2018-06-01T09:15:08.692407+00:00 app[web.1]: SEVERE: org.apache.commons.exec.ExecuteException: Process exited with an error: 127 (Exit value: 127)
2018-06-01T09:15:08.692918+00:00 app[web.1]: Exception in thread "Thread-14" org.openqa.selenium.WebDriverException: Timed out waiting for driver server to start.
2018-06-01T09:15:08.692921+00:00 app[web.1]: Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
2018-06-01T09:15:08.692931+00:00 app[web.1]: System info: host: '25cd720a-5a6d-4e75-b214-9d81aafe7880', ip: '172.16.177.98', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0-1019-aws', java.version: '1.8.0_171-heroku'
2018-06-01T09:15:08.692994+00:00 app[web.1]: Driver info: driver.version: ChromeDriver
2018-06-01T09:15:08.693054+00:00 app[web.1]: at org.openqa.selenium.remote.service.DriverService.waitUntilAvailable(DriverService.java:193)
2018-06-01T09:15:08.694600+00:00 app[web.1]: at org.openqa.selenium.remote.service.DriverService.start(DriverService.java:181)
2018-06-01T09:15:08.694661+00:00 app[web.1]: at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:78)
2018-06-01T09:15:08.694716+00:00 app[web.1]: at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:637)
2018-06-01T09:15:08.694798+00:00 app[web.1]: at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:250)
2018-06-01T09:15:08.694853+00:00 app[web.1]: at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:236)
2018-06-01T09:15:08.694938+00:00 app[web.1]: at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:137)
2018-06-01T09:15:08.694993+00:00 app[web.1]: at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:184)
2018-06-01T09:15:08.695049+00:00 app[web.1]: at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:171)
2018-06-01T09:15:08.695133+00:00 app[web.1]: at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:124)
2018-06-01T09:15:08.695187+00:00 app[web.1]: at com.pazukdev.auxiliary_services.DemoService.prepareBrowser(DemoService.java:100)
2018-06-01T09:15:08.695276+00:00 app[web.1]: at com.pazukdev.auxiliary_services.DemoService.executeTasks(DemoService.java:63)
2018-06-01T09:15:08.695337+00:00 app[web.1]: at com.pazukdev.auxiliary_services.DemoService.access$000(DemoService.java:22)
2018-06-01T09:15:08.696501+00:00 app[web.1]: at com.pazukdev.auxiliary_services.DemoService$1.run(DemoService.java:39)
2018-06-01T09:15:08.696566+00:00 app[web.1]: at java.lang.Thread.run(Thread.java:748)
2018-06-01T09:15:08.697012+00:00 app[web.1]: Caused by: org.openqa.selenium.net.UrlChecker$TimeoutException: Timed out waiting for [http://localhost:32260/status] to be available after 20021 ms
2018-06-01T09:15:08.697192+00:00 app[web.1]: at org.openqa.selenium.net.UrlChecker.waitUntilAvailable(UrlChecker.java:107)
2018-06-01T09:15:08.697251+00:00 app[web.1]: at org.openqa.selenium.remote.service.DriverService.waitUntilAvailable(DriverService.java:190)
2018-06-01T09:15:08.697305+00:00 app[web.1]: ... 14 more
2018-06-01T09:15:08.697708+00:00 app[web.1]: Caused by: com.google.common.util.concurrent.UncheckedTimeoutException: java.util.concurrent.TimeoutException
2018-06-01T09:15:08.697772+00:00 app[web.1]: at com.google.common.util.concurrent.SimpleTimeLimiter.callWithTimeout(SimpleTimeLimiter.java:140)
2018-06-01T09:15:08.697878+00:00 app[web.1]: at org.openqa.selenium.net.UrlChecker.waitUntilAvailable(UrlChecker.java:80)
2018-06-01T09:15:08.698077+00:00 app[web.1]: ... 15 more
2018-06-01T09:15:08.698848+00:00 app[web.1]: Caused by: java.util.concurrent.TimeoutException
2018-06-01T09:15:08.698916+00:00 app[web.1]: at java.util.concurrent.FutureTask.get(FutureTask.java:205)
2018-06-01T09:15:08.699230+00:00 app[web.1]: at com.google.common.util.concurrent.SimpleTimeLimiter.callWithTimeout(SimpleTimeLimiter.java:128)
2018-06-01T09:15:08.699288+00:00 app[web.1]: ... 16 more
首先,可以肯定的是,您已经使用 heroku 构建包在 heroku 上安装了chromedriver
?如果没有,则必须通过包含以下两个构建包来安装它们:
- Heroku-buildpack-google-chrome
- heroku-buildpack-chromedriver
接下来,请注意 README forheroku-buildpack-google-chrome
的末尾,其中向您展示了如何获取需要传递到ChromeOptions
chromedriver
路径,从您显示的内容来看,您尚未传入。
最后,您正在实例化上面的新ChromeOptions
对象,但从您显示的内容来看,您并没有将其传递给ChromeDriver
,您应该这样做:
driver = new ChromeDriver(options);
您看到它在您的开发环境中而不是在 heroku 上运行的原因可能是因为chromedriver
安装在 Selenium 希望找到它的地方,但是在 heroku 上运行时您需要显式路径该位置。