Intereting Posts
JAccess :: getUsersByGroup, как проверить, активирован ли пользователь в joomla и сортировать его по алфавиту по имени Оператор Тильды в регулярных выражениях Ошибка с пользовательской функцией PHP: никакая переменная не возвращается Есть ли способ, чтобы Behat НЕ выходил из строя на ошибках уведомления PHP? метод laravel в href link? завиток нет ответа эхо-печать Изменение допустимых тегов htmlpurifier для этой разметки PHP DOMDocument получает текст между двумя тегами SETS xml пустые теги с PHP DOMDocument Форматировать текст в файле Excel через PHP Paypal sandbox – тестовый платеж Как отсортировать массив на основе определенного поля в массиве? Загрузка изображения в базе данных MySQL PHP Ошибка как читать файлы, сохраненные на сервере, используя php и совершать вызовы на эту php-страницу, используя ajax для отображения списка файлов PHP-массив: целочисленный индекс и индекс строки

php-webdriver: дождитесь ответа браузера после отправки формы, используя click ()

Помимо использования функции sleep() в моем тесте, мне интересно, знает ли кто-нибудь о лучшей стратегии, чтобы явно ждать завершения подачи формы (POST), прежде чем продолжить мои утверждения. Вот очень сжатая версия того, как выглядит мой тест, используя phpunit вместе php-webdriver от Facebook).

 function test_form_submission() { // setup $web_driver = new WebDriver(); $session = $web_driver->session(); $session->open('http://example.com/login'); // enter data $session->element('css selector', 'input[name=email]')->value(array('value' => str_split('test@example.com'))); $session->element('css selector', 'input[name=password]')->value(array('value' => str_split('testpassword'))); // click button to submit form $session->element('css selector', 'button[name=submit]')->click(); // How do I wait here until the click() above submits the form // so I can check that we correctly arrives at the destination below // without resorting to sleep()? // Confirm that login was successful because we landed on account page $this->assertSame('http://example.com/account', $session->url()); // teardown $session->close(); } 

php-webdriver из Facebook был переписан в июне 2013 года. Вы можете дождаться, когда URL-адрес будет легко подобен.

 // wait for at most 10 seconds until the URL is 'http://example.com/account'. // check again 500ms after the previous attempt. $driver->wait(10, 500)->until(function ($driver) { return $driver->getCurrentURL() === 'http://example.com/account'; }) 

Хорошо, поэтому я знаю, что это очень старый вопрос, но когда я наткнулся на него через Google, я надеюсь, что это может быть полезно кому-то (может быть, даже OP? :-)).

После довольно некоторых поисков и чтения статей и сообщений в Google Code я нашел решение, которое, я думаю, довольно уродливо, но на самом деле нет хорошей альтернативы. Вы можете прочитать здесь, что WebDriver невозможно обнаружить при загрузке страницы. Итак, мы должны вернуться к ожиданию. Теперь OP использует PHP WebDriver от Facebook, который не включает в себя ожидающие утилиты AFAIK, но при использовании этого поддерживаемого клона вы получаете реализацию WebDriverWait.

Теперь вопрос: чего мы ждем? Вы можете дождаться изменения URL-адреса, но это никоим образом не является надежным подходом, поскольку страница, вероятно, еще не загружена, когда URL уже изменился. Следующая опция: дождитесь, пока элемент, который вы знаете, находится на загружаемой странице. Это будет работать, но что, если вы хотите иметь более общий подход? К счастью, я прочитал очень хорошую идею в упомянутой выше теме . Вы можете дождаться исчезновения элемента, который находится на обеих страницах, и повторного появления, например нижнего колонтитула.

Я реализовал это сейчас и, похоже, работает. Функция ниже может быть передана ваш $session и будет возвращаться только при загрузке новой страницы (или, по крайней мере, нижний колонтитул доступен снова).

 public static function waitForNextPage($pWDSession) { $aWait = new PHPWebDriver_WebDriverWait($pWDSession); // wait for footer to not be available anymore $aWait->until( function($pWDSession) { return (0 === count($pWDSession->elements(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "#footer,#mx-footer"))); } ); // wait for footer to be available again $aWait->until( function($pWDSession) { return (0 < count($pWDSession->elements(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "#footer,#mx-footer"))); } ); } 

Вы, очевидно, можете изменить селектор или использовать какой-то другой элемент, идея остается прежней.

Я надеюсь, что это помогает! Ура!

Вы можете использовать Implicit Wait and Explicit Wait чтобы ждать определенного веб-элемента, пока он не появится на странице. Период ожидания, который вы можете определить, и это зависит от приложения.

Явный Ожидание:

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

Код:

  WebDriverWait wait = new WebDriverWait(driver,30); wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(strEdit))); 

Или

  WebElement myDynamicElement = (new WebDriverWait(driver, 30)) .until(new ExpectedCondition<WebElement>(){ @Override public WebElement apply(WebDriver d) { return d.findElement(By.id("myDynamicElement")); }}); 

Это ждет до 30 секунд, прежде чем бросать исключение TimeoutException или если он обнаружит, что элемент вернет его за 0 – 30 секунд. WebDriverWait по умолчанию вызывает ExpectedCondition каждые 500 миллисекунд, пока он не вернется успешно. Успешное возвращение для типа ExpectedCondition – это Boolean return true или not null возвращаемое значение для всех других типов ExpectedCondition.

Вы можете использовать класс ExpectedConditions, как вам нужно для приложения.

Неявный Ожидание:

Неявное ожидание означает, что WebDriver должен опросить DOM в течение определенного периода времени, пытаясь найти элемент или элементы, если они не доступны сразу

Код:

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

Одна вещь, о которой следует помнить, заключается в том, что после установки неявного ожидания – это останется для жизни экземпляра объекта WebDriver

Для получения дополнительной информации используйте эту ссылку http://seleniumhq.org/docs/04_webdriver_advanced.jsp

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