Selenium 2: прервать загрузку страницы - PullRequest
7 голосов
/ 17 июня 2011

У меня проблема при нажатии кнопки с Java-интерфейсом Selenium 2.0b3 с FirefoxDriver.Нажатие на кнопку отправляет форму веб-серверу, а затем браузер переходит на новую страницу в результате отправки формы.

При нажатии на элемент с помощью element.click (), selenium ожидает браузерзавершить свои операции.Браузер ожидает окончания загрузки страницы.Но иногда загрузка страницы занимает огромное количество времени из-за некоторых рекламных запросов.

Как обойти синхронизацию между element.click () и загрузкой страницы?

РЕДАКТИРОВАТЬ:

Как описано в WebElement javadoc :

Щелкните этот элемент.Если это приводит к загрузке новой страницы, этот метод будет блокироваться до тех пор, пока страница не загрузится.

Спасибо

Ответы [ 3 ]

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

Попробуйте использовать бета-версию только для Firefox, перечисленных в последнем разделе вики-страницы firefoxdriver http://code.google.com/p/selenium/wiki/FirefoxDriver

Вам понадобится как минимум версия 2.9, я рекомендую перейти на последнюю версию 2.18 (2.0b3 - это почтилет!)

1 голос
/ 17 июня 2011

driver.get () фактически должен блокироваться, пока страница не закончит загрузку. Однако иногда это не происходит, например, если JavaScript продолжает загружаться после загрузки основного HTML. В этом случае у вас иногда возникают проблемы с щелчком элементов, которые еще не появились. Вы можете либо использовать WebDriverWait (), чтобы дождаться появления элемента, либо увеличить неявное время ожидания с помощью:

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

Вот эквивалент использования WebDriverWait:

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

    Actions builder = new Actions(driver);
    builder.click(driver.findElement(by)).perform();
}

И класс waitForElement:

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;
        }
    }
}
0 голосов
/ 16 сентября 2011

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

protected static void maybeAsyncClick(WebElement element, WebDriver driver)
{
    Actions builder = new Actions(driver);
    Action newClick = builder.moveToElement(element)
                            .click()
                            .build();
    newClick.perform();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...