Chrome просмотр windows остается открытым даже после сбоя сеанса с WebDriverException - PullRequest
2 голосов
/ 05 февраля 2020

Я использую селен 3.141.59 с chrome 79 и chromedriver 79. Случайно я получаю исключение из RemoteWebDriver.get(url); и этот сеанс удаляется с сервера селена. Но окно Chrome остается открытым. Из-за этого я не могу создавать новые сеансы с тем же каталогом пользователя. При каждой попытке создать новый сеанс открывается окно chrome, но создание сеанса не удается. Так что все они открываются Chrome windows, что приводит к утечке памяти! Я пытался установить timeout и browserTimeout с сервера, но это не помогло. Любая идея, что происходит?

Я запускаю сервер по:

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");

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Вам необходимо учесть несколько вещей:

  • - user-data-dir : Относится к каталогу , где браузер хранит пользователя профиль. Таким образом, вы не можете передать любое произвольное значение. См .: это и это обсуждение.
  • - disable-gpu : Отключение аппаратного ускорения графического процессора . Если средство визуализации программного обеспечения отсутствует, процесс GPU не запустится. Однако цель аргумента --disable-gpu состояла в том, чтобы включить на платформе. Это было необходимо, поскольку SwiftShader не может выполнить утверждение на Windows в режиме без головы ранее. Поскольку вы находитесь на os , вам необходимо удалить его. См .: это и это обсуждение.
  • В идеале вы должны добавлять только те аргументы, которые являются обязательными согласно Спецификациям тестирования .
  • Пример минимального блока кода:

    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 теряет контроль над Контекстом просмотра и оба превращаются в Zomb ie процесс . Следовательно, окно остается открытым.

0 голосов
/ 05 февраля 2020

Что делать, если вы используете функцию try and кроме? Где, кроме, вы позволяете драйверу закрыть 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

Или вы можете попытаться открыть новое окно chrome после исключения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...