Как дождаться перенаправления страницы в Selenium?

Я пытаюсь выполнить относительно простую задачу: дождаться завершения перенаправления страницы. Только что видел другое ответил на вопрос по этому вопросу, где Совет-дождаться появления определенного текста на последней странице (если я правильно понял). Если да, то как насчет подождать до window.location изменится? Так лучше? Хуже? Менее применимым? Есть другие идеи? просто любопытно, если необходимо, может отметить этот вопрос как сообщество вики.

спасибо!

3 ответов


Да, я сталкивался с этой проблемой много раз при использовании Селена. Есть 2 способа, которыми я работал над этой проблемой. Во-первых, вы можете фактически изменить неявное время ожидания. Например, данный фрагмент кода:

Actions builder = new Actions( driver );
builder.click( driver.findElement( By.className("lala") ) ).perform();

этот код выдаст исключение, если в точке его вызова нет элементов, которые могут быть найдены в соответствии с классом "lala". Вы можете изменить это неявное время ожидания с помощью:

driver.manage().timeouts().implicitlyWait( 5, TimeUnit.SECONDS );

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

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

public static void waitAndClick( WebDriver driver, By by, String text ) {
    WebDriverWait wait = new WebDriverWait( driver, 10000 );
    Function<WebDriver, Boolean> waitForElement = new waitForElement( by );
    wait.until( waitForElement );

    for( WebElement e : driver.findElements( by ) ) {
        if( e.getText().equals( text ) ) {
            Actions builder = new Actions( driver );
            builder.click( e ).perform();
            return;
        }
    }
}

и соответствующая функция, которую он использует:

public class waitForElement implements Function<WebDriver, Boolean> {
    private final By by;
    private String text = null;

    public waitForElement( By by ) {
        this.by = by;
    }

    public waitForElement( By by, String text ) {
        this.by   = by;
        this.text = text;
    }

    @Override
    public Boolean apply( WebDriver from ) {
        if( this.text != null ) {
            for( WebElement e : from.findElements( this.by ) ) {
                if( e.getText().equals( this.text ) ) {
                    return Boolean.TRUE;
                }
            }

            return Boolean.FALSE;
        } else {
            try {
                from.findElement( this.by );
            } catch( Exception e ) {
                return Boolean.FALSE;
            }

            return Boolean.TRUE;
        }
    }
}

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


мониторинг значения, возвращается driver.get_location отлично справился со мной. По-видимому, из того, что я понял в моих 5 минутах, заглядывая в код, было то, что window.location.href значение контролируется под капотом.


вы можете использовать эту функцию, она повторно загрузит текущую страницу ( после перенаправления): водитель.getCurrentUrl();