打开新的浏览器窗口后,此版本的ChromeDriver尚未经过Chrome 75和java.lang.IllegalStateException的测试。

时间:2019-07-16 10:22:44

标签: java selenium google-chrome selenium-chromedriver selenide

我有一个测试类,其中有多个交替运行的替代测试。为了确保测试是隔离的,并且不会使构建代理感到压力很大,我想在每个测试之间关闭并打开一个新的浏览器实例。

当第一个打开新浏览器实例的测试之后,我遇到的问题是IllegalStateException。

Selenide Version: 5.2.3
Chrome Version: 75.0.3770.100
Browser Driver Version: 74.0.3729.6
Selenium Version: 3.141.59
OS Version: Windows 10

到目前为止,我已经尝试从测试中删除Selenide.close()方法调用,但这导致每个测试使用相同的窗口。新的测试从最后一次测试结束的地方开始,那对我来说并不理想-我希望我的测试能够被隔离。我还尝试使用其他方式实例化和关闭浏览器窗口,但使用最新的Selenide版本并没有成功。

private static final String CHROMEDRIVER_V = "74.0.3729.6"
private static final String DEFAULT_TITLE = "Title";
private static final String TITLE_1 = "New alphabetic title";
private static final String TITLE_2 = "123456";

@BeforeEach
void beforeEach() throws Exception {
    setup();
    loginToService();
}

@Test
public void case_one() {
    HomePage.title.shouldHave(Condition.text(DEFAULT_TITLE));
    HomePageActions.changeTitle(TITLE_1));
    HomePage.title.shouldHave(Condition.text(TITLE_1));
}

@Test
public void case_two() {
    HomePage.title.shouldHave(Condition.text(DEFAULT_TITLE));
    HomePageActions.changeTitle(TITLE_2));
    HomePage.title.shouldHave(Condition.text(TITLE_2));
}

@AfterEach
void afterEach() throws Exception {
    teardown();
}

private void setup() {
    String url = "http://localhost:8080/login";
    WebDriverManager.chromedriver()
        .version(CHROMEDRIVER_V)
        .timeout(20000)
        .forceDownload()
        .setup();
    Selenide.open(url);
}

private void teardown() {
    Selenide.close();
}

private void loginToService() {
    LoginPage.loginField.setValue("login");
    LoginPage.passField.setValue("pass");
    LoginPage.loginButton.click();
    HomePage.page.shouldBe(Condition.visible);

因此,使用上面的代码,我希望在启动整个测试类时可以这样做: 1.执行beforeEach()方法,设置一个新的浏览器实例并登录到我们的服务。 2.做case_one()方法,测试所需的东西 3.执行afterEach()方法,关闭我们的浏览器实例并释放资源 4.再次执行beforeEach() 5.立即执行case_two() 6.再次执行afterEach(),测试套件完成

事实上,我得到的是1-3运行正常,没有问题,并且随着新浏览器窗口的出现,第4步显然开始正常,但是在尝试从第4步执行登录代码时,该运行返回了异常。 >

июл 15, 2019 6:22:52 PM com.codeborne.selenide.drivercommands.LazyDriver getAndCheckWebDriver
INFO: No webdriver is bound to current thread: 1 - let's create a new webdriver
Starting ChromeDriver 74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}) on port 7568
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
[1563204173.792][WARNING]: This version of ChromeDriver has not been tested with Chrome version 75.
июл 15, 2019 6:22:54 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
июл 15, 2019 6:22:54 PM com.codeborne.selenide.webdriver.BrowserResizer adjustBrowserSize
INFO: Set browser size to 1366x768
июл 15, 2019 6:22:55 PM com.codeborne.selenide.webdriver.WebDriverFactory logBrowserVersion
INFO: BrowserName=chrome Version=75.0.3770.100 Platform=XP
июл 15, 2019 6:22:55 PM com.codeborne.selenide.webdriver.WebDriverFactory createWebDriver
INFO: Selenide v. 5.2.3
июл 15, 2019 6:22:55 PM com.codeborne.selenide.webdriver.WebDriverFactory logSeleniumInfo
INFO: Selenium WebDriver v. 3.141.59 build time: 2018-11-14T08:17:03
июл 15, 2019 6:22:55 PM com.codeborne.selenide.drivercommands.CreateDriverCommand createDriver
INFO: Create webdriver in current thread 1: ChromeDriver -> ChromeDriver: chrome on XP (c531a2374a250d21a63eedec3d35c942)
июл 15, 2019 6:22:59 PM com.codeborne.selenide.drivercommands.CloseDriverCommand run
INFO: Close webdriver: 1 -> ChromeDriver: chrome on XP (c531a2374a250d21a63eedec3d35c942)
июл 15, 2019 6:22:59 PM com.codeborne.selenide.drivercommands.CloseBrowser run
INFO: Trying to close the browser ChromeDriver ...
июл 15, 2019 6:22:59 PM com.codeborne.selenide.drivercommands.CloseDriverCommand run
INFO: Closed webdriver 1 in 772 ms

java.lang.IllegalStateException: Webdriver has been closed. You need to call open(url) to open a browser again.

    at com.codeborne.selenide.drivercommands.LazyDriver.getWebDriver(LazyDriver.java:64)
    at com.codeborne.selenide.impl.ElementFinder.getSearchContext(ElementFinder.java:86)
    at com.codeborne.selenide.impl.ElementFinder.getWebElement(ElementFinder.java:74)
    at com.codeborne.selenide.commands.ToWebElement.execute(ToWebElement.java:11)
    at com.codeborne.selenide.commands.ToWebElement.execute(ToWebElement.java:8)
    at com.codeborne.selenide.commands.Commands.execute(Commands.java:144)
    at com.codeborne.selenide.impl.SelenideElementProxy.invoke(SelenideElementProxy.java:57)
    at com.sun.proxy.$Proxy16.toWebElement(Unknown Source)
    at com.codeborne.selenide.impl.ElementFinder.getSearchContext(ElementFinder.java:87)
    at com.codeborne.selenide.impl.ElementFinder.getWebElement(ElementFinder.java:74)
    at com.codeborne.selenide.impl.WebElementSource.checkCondition(WebElementSource.java:50)
    at com.codeborne.selenide.commands.Should.should(Should.java:35)
    at com.codeborne.selenide.commands.Should.execute(Should.java:29)
    at com.codeborne.selenide.commands.Should.execute(Should.java:12)
    at com.codeborne.selenide.commands.Commands.execute(Commands.java:144)
    at com.codeborne.selenide.impl.SelenideElementProxy.dispatchAndRetry(SelenideElementProxy.java:99)
    at com.codeborne.selenide.impl.SelenideElementProxy.invoke(SelenideElementProxy.java:65)
    at com.sun.proxy.$Proxy16.shouldBe(Unknown Source)
    at my.project.java.TestClass.loginToService(TestClass.java:)
    at my.project.java.TestClass.beforeEach(TestClass.java:)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:628)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
    at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.invokeMethodInExtensionContext(ClassTestDescriptor.java:302)
    at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$synthesizeBeforeEachMethodAdapter$12(ClassTestDescriptor.java:290)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeEachMethods$2(TestMethodTestDescriptor.java:135)
    at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeMethodsOrCallbacksUntilExceptionOccurs(TestMethodTestDescriptor.java:155)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeEachMethods(TestMethodTestDescriptor.java:134)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:109)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:58)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:74)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

这是您的浏览器存在的问题,因为您使用的是较新的浏览器版本。 更新您的Chrome驱动程序,使用其他浏览器或降级您的Chrome浏览器将解决您的问题。

如果我目前正确,您正在下载chrome驱动程序并进行配置,然后再运行它。在这种情况下,Chrome或Firefox或将打开的版本将被打开,但是如果将浏览器升级到最新版本,则无法执行测试。

但是请使用Webdriver Manager来避免这种情况。因此,您可以使用任何驱动程序,只需要做的就是更新Webdriver Manager的版本号。

<dependency>
    <groupId>io.github.bonigarcia</groupId>
    <artifactId>webdrivermanager</artifactId>
    <version>3.4.0</version>
</dependency>

您可以这样称呼

      if(browser.equalsIgnoreCase("Chrome")){
            WebDriverManager.chromedriver().setup();
            ChromeOptions chromeOptions = new ChromeOptions();
            chromeOptions.addArguments("--no-sandbox");
            chromeOptions.addArguments("window-size=1400,2100");
            driver = new ChromeDriver(chromeOptions);
        }

答案 1 :(得分:1)

此错误消息...

[WARNING]: This version of ChromeDriver has not been tested with Chrome version 75.

...表示 ChromeDriver 无法启动/产生新的 WebBrowser ,即 Chrome浏览器会话。

您的主要问题是所使用的二进制版本之间的不兼容性

  • 您正在使用 chromedriver = 74.0
  • chromedriver=74.0的发行说明中明确提到以下内容:
  

支持 Chrome v74

  • 您正在使用 chrome = 75.0
  • ChromeDriver v75.0的发行说明中明确提到以下内容:
  

支持 Chrome 75版

因此 ChromeDriver v74.0 Chrome浏览器v75.0

之间存在明显的不匹配

解决方案


Outro

您可以在This version of ChromeDriver has not been tested with Chrome version 75 error with Selenium ChromeDriver and Chrome through facebook/php-webdriver

中找到类似的讨论