【问题标题】:Chrome browsing windows stays open even after session failed with WebDriverException即使会话因 WebDriverException 失败,Chrome 浏览窗口仍保持打开状态
【发布时间】:2020-02-05 09:20:36
【问题描述】:

我将 selenium 3.141.59 与 chrome 79 和 chromedriver 79 一起使用。随机我从 RemoteWebDriver.get(url); 收到一个异常,并且该会话从 selenium 服务器中删除。但是 Chrome 窗口保持打开状态。因此,我无法使用相同的用户目录创建新会话。在我每次尝试创建新会话时,chrome 窗口都会打开,但会话创建失败。所以那些所有打开的 Chrome 窗口都会导致内存泄漏!我试图从服务器设置超时和浏览器超时,但它没有帮助。知道发生了什么吗?

我正在通过以下方式启动服务器:

java -jar -Dselenium.LOGGER.level=ALL selenium-server-standalone-3.141.59.jar -timeout 250 -browserTimeout 300

我随机得到的异常:

Caused by: org.openqa.selenium.WebDriverException: java.net.ConnectException: Connection refused (Connection refused)
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'myhost', ip: 'myip', os.name: 'Linux', os.arch: 'amd64', os.version: '4.14.154-128.181.amzn2.x86_64', java.version: '1.8.0_201'
Driver info: mypackage.SeleniumHelper$2
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 79.0.3945.88, chrome: {chromedriverVersion: 79.0.3945.36 (3582db32b3389..., userDataDir: /var/tmp/username...}, goog:chromeOptions: {debuggerAddress: localhost:35341}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: LINUX, platformName: LINUX, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webdriver.remote.sessionid: 66ddc30a30affc4ba52a539bc41...}
Session ID: 66ddc30a30affc4ba52a539bc411ac2c
        at sun.reflect.GeneratedConstructorAccessor1082.newInstance(Unknown Source) ~[?:?]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_201]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_201]
        at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187) ~[selenium-remote-driver-3.141.59.jar:?]
        at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122) ~[selenium-remote-driver-3.141.59.jar:?]
        at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49) ~[selenium-remote-driver-3.141.59.jar:?]
        at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158) ~[selenium-remote-driver-3.141.59.jar:?]
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552) ~[selenium-remote-driver-3.141.59.jar:?]
        at org.openqa.selenium.remote.RemoteWebDriver.get(RemoteWebDriver.java:277) ~[selenium-remote-driver-3.141.59.jar:?]
        ... 65 more

我的 chrome 选项:

ChromeOptions options = new ChromeOptions ();
options.addArguments ("user-data-dir=/var/tmp/username");
options.addArguments ("disable-gpu");
options.addArguments ("disable-impl-side-painting");
options.addArguments ("disable-dev-shm-usage");
options.addArguments ("disable-infobars");
options.addArguments ("disable-gpu-sandbox");
options.addArguments ("no-sandbox");
options.addArguments ("disable-accelerated-2d-canvas");
options.addArguments ("disable-accelerated-jpeg-decoding");
options.addArguments ("test-type=ui");
options.addArguments ("no-proxy-server");

【问题讨论】:

  • userDataDir 是如何定义的?
  • 假设它一直是/var/tmp/username
  • 如果你使用 try 和 except 函数,在 except 中,你让驱动程序关闭 chrome 并再次重新打开它以创建新会话?
  • 如果发生异常,实际上我正在调用 driver.close() 和 driver.quit() 。但它不会关闭 Chrome 窗口。
  • 这就像 selenium 服务器失去了对 Chrome 窗口的控制。我在服务器日志中看到“正在删除会话 blabla”,但 Chrome 窗口保持打开状态。

标签: selenium google-chrome selenium-webdriver selenium-chromedriver chrome-options


【解决方案1】:

你需要考虑一些事情:

  • --user-data-dir:指浏览器存储用户配置文件的directory。所以你不能传递任何任意值。请参阅:thisthis 讨论。
  • --disable-gpuDisables GPU hardware acceleration。如果软件渲染器没有到位,那么 GPU 进程将不会启动。然而,参数--disable-gpu 的目的是在 平台上启用。之前需要它作为SwiftShader fails an assert on Windows in headless mode。正如您在 os 上一样,您需要将其删除。请参阅:thisthis 讨论。
  • 理想情况下,您只需要根据您的测试规范添加强制性参数。
  • 示例最小代码块:

    public class A_Chrome 
    {
        public static void main(String[] args) 
        {
            System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
            ChromeOptions options = new ChromeOptions();
            options.addArguments("start-maximized");
            options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
            options.setExperimentalOption("useAutomationExtension", false);
            WebDriver driver =  new ChromeDriver(options);
            driver.get("https://www.google.com/");
            driver.quit();
        }
    }
    
  • 最后,当您的程序引发异常时,WebDriver 实例会失去对浏览上下文的控制,并且两者都会变成Zombie process。因此 窗口保持打开状态。

【讨论】:

  • 感谢您的详细解答,我会尝试发布结果!
【解决方案2】:

如果你使用 try 和 except 函数会怎样?除了在哪里,您让驱动程序关闭 chrome 并再次重新打开它以创建新会话?

     try:
       #set your try code here
     except TimeoutException:
       print('Page took too long to load or there was a different problem :(')
       driver.quit()
          try:
            #set your new code here
          except:
            #set your except here

或者你可以尝试在except之后打开一个新的chrome窗口

【讨论】:

  • 不幸的是,在这种情况下,驱动程序无法关闭 Chrome。我不知道为什么!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多