приостановить все темы без ожидания - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь построить бота с селеном. проблема в том, что время от времени сайт выходил из меня без какого-либо уведомления. Я знаю, как это обнаружить, и я знаю, как справиться с этим. проблема в том, что перед каждой строкой нецелесообразно проверять, вышел ли сервер из системы. вот что я могу сделать:

    ChromeDriver driver = new ChromeDriver();
    driver.get(url);
    Connect(driver, loginData);
    if(isConnected(driver) == false)
        reconnect(driver, loginData);
    driver.findElement(By.id("element-id")).click();
    if(isConnected(driver) == false)
        reconnect(driver, loginData);
    ...

Но проверка необходимости повторного подключения каждой линии не является хорошим решением. Я думал о создании потока, который будет постоянно проверять, отключился ли я, но я не знаю, как приостановить основной поток, пока я не подключусь к серверу, когда узнаю, что отключился

Ответы [ 4 ]

0 голосов
/ 11 сентября 2018

У вас может быть решение, похожее на ваше, но вместо создания собственной оболочки для ChromeDriver вы можете использовать EventFiringWebDriver для этого.

0 голосов
/ 10 сентября 2018

Время выхода вашего веб-сайта, похоже, истекло. Как я полагаю, вы тестируете в непроизводственной среде, пожалуйста, посмотрите, как установить time_out = 0 (no-expire).

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

0 голосов
/ 10 сентября 2018

Я решил это, обернув ChromeDriver собственным классом, который проверяет перед каждой операцией, обнаружен ли разрыв. если у кого-то есть лучшее решение, я бы хотел услышать. Это мое решение:

    public java.util.List<WebElement> findElements(By by) throws disconnectException {
    if(keepLogin) {
        if(checkConnectionOver()) {
            throw new disconnectException();
        }
    }
    return driver.findElements(by);
}

public WebElement findElement(By by) throws disconnectException {
    if(keepLogin) {
        if(checkConnectionOver()) {
            throw new disconnectException();
        }
    }
    return driver.findElement(by);
}

public Object executeScript(String script, Object... args) throws disconnectException {
    if(keepLogin) {
        if(checkConnectionOver()) {
            throw new disconnectException();
        }
    }
    return driver.executeScript(script, args);
}

public void get(String url) {
    driver.get(url);
}

public String getCurrentUrl() {
    return driver.getCurrentUrl();
}
0 голосов
/ 09 сентября 2018

вы можете запустить проверку внутри цикла while в боковом потоке, и если сервер отключит вас, остановите основной поток. после повторного подключения перезагрузите его снова.

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