многопоточность: chromedriver не открывает URL во втором окне - PullRequest
0 голосов
/ 14 октября 2018

Java-код в функции потока:

    System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
    ChromeOptions chromeOptions = new ChromeOptions();
    chromeOptions.addArguments("--no-sandbox");
    chromeOptions.addArguments("--user-data-dir="+config.chromeUserDir);
    chromeOptions.addArguments("--profile-directory="+profile);
    chromeOptions.addArguments("--start-maximized");
    WebDriver driver = new ChromeDriver(chromeOptions);
    driver.get("https://www.google.com");

и создание объекта и запуск в потоке со следующим кодом

    Driver d1 = new Driver(profile);
    d1.start();

    Driver d2 = new Driver(profile1);
    d1.start();

созданы два разных профиля, код хорошо работает с одним потокомно с несколькими потоками он не открывает веб-сайт Google в двух отдельных окнах.он говорит,

Starting ChromeDriver 2.42.591071 (0b695ff80972cc1a65a5cd643186d2ae582cd4ac) on port 25692
Only local connections are allowed.
Starting ChromeDriver 2.42.591071 (0b695ff80972cc1a65a5cd643186d2ae582cd4ac) on port 25954
Only local connections are allowed.
Oct 14, 2018 2:10:46 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
Oct 14, 2018 2:10:46 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
Created new window in existing browser session.

, и он открывает Google только в одном окне.окно, открытое пыльником, остается бездействующим.Может ли кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 09 июня 2019

Поскольку каталог пользовательских данных блокируется при первом запуске экземпляра, вы можете изменить кеш форддера профиля 2.

0 голосов
/ 14 октября 2018

Анализ проблемы

Эта проблема может быть воспроизведена, даже если вы попытаетесь запустить драйвер Chrome в двух последовательных профилях без выхода из драйвера.

    ChromeOptions chromeOptions1 = new ChromeOptions();
    chromeOptions1.addArguments("--user-data-dir=C:/Users/My UserName/AppData/Local/Google/Chrome/User Data/Default");
    chromeOptions1.addArguments("--profile-directory=Profile 1");
    WebDriver driver1 = new ChromeDriver(chromeOptions1);
    driver1.get("https://www.google.com");

    ChromeOptions chromeOptions2 = new ChromeOptions();
    chromeOptions2.addArguments("--user-data-dir=C:/Users/My UserName/AppData/Local/Google/Chrome/User Data/Default");
    chromeOptions2.addArguments("--profile-directory=Profile 2");
    WebDriver driver2 = new ChromeDriver(chromeOptions2);

При запускеЗапустится браузер первого экземпляра, и страница будет принята.Во время работы запускается второй экземпляр браузера, но страница не открывается.Сбой строки driver.get() со следующим исключением для второго экземпляра

Exception in thread "main" org.openqa.selenium.NoSuchSessionException: invalid session id
  (Driver info: chromedriver=70.0.3538.16 (16ed95b41bb05e565b11fb66ac33c660b721f778),platform=Windows NT 10.0.17134 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 2.99 seconds
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{message=unknown error: Chrome failed to start: crashed
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location C:\Program Files (x86)\Google\Chrome\Application\chrome.exe is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
  (Driver info: chromedriver=70.0.3538.16 (16ed95b41bb05e565b11fb66ac33c660b721f778),platform=Windows NT 10.0.17134 x86_64), platform=ANY}]

При запуске первого экземпляра каталог пользовательских данных блокируется, и мы получаем ошибку для второго экземпляра, так как каталог пользовательских данных находится виспользовать.

Мы можем смоделировать эту проблему, открыв один экземпляр Chrome вручную с одним профилем и попытавшись открыть еще один экземпляр Chrome с другим профилем с помощью драйвера Chrome.

Решение

Мы должны использовать разные каталоги пользовательских данных для каждого профиля.Нам не нужно создавать профиль вручную в браузере Chrome, а также не нужно указывать аргумент --profile-directory в параметрах Chrome.Но вы можете поддерживать сеансы и историю, указав разные пути user-data-dir для каждого экземпляра драйвера chrome

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--user-data-dir=C:/ChromeProfiles/FirstProfile"); // Custom directory path for first profile
WebDriver driver = new ChromeDriver(chromeOptions);
driver.get("https://www.google.com");

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--user-data-dir=C:/ChromeProfiles/SecondProfile"); // Custom directory path second profile
WebDriver driver = new ChromeDriver(chromeOptions);
driver.get("https://www.google.com");

Это позволит поддерживать сеансы и историю в двух профилях, которые вы ищете.

Также многопоточность будет работать без проблем.

class Driver extends Thread {
    private String profile;
    public Driver(String profile){
        this.profile=profile;
    }
    public void run()
    {
        System.out.println ("Thread " +
                    Thread.currentThread().getId() +
                    " is running");
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.addArguments("--no-sandbox");
        chromeOptions.addArguments("--user-data-dir=C:/ChromeProfiles/"+profile);
//        chromeOptions.addArguments("--profile-directory="+profile);
        chromeOptions.addArguments("--start-maximized");
        WebDriver driver = new ChromeDriver(chromeOptions);
        driver.get("https://www.google.com");

    }
}

public class MultiThreadDriver
{
    public static void main(String[] args)
    {
        ChromeDriverManager.getInstance().setup();
        Driver object = new Driver("First Profile");
        object.start();
        Driver object1 = new Driver("Second Profile");
        object1.start();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...