Может кто-нибудь разрешить мне, как заставить селен ждать, пока страница полностью не загрузится? Я хочу что-то общее, я знаю, что могу настроить WebDriverWait и вызвать что-то вроде 'find', чтобы заставить его ждать, но я не захожу так далеко. Мне просто нужно проверить, что страница загружается успешно, и перейти к следующей странице для проверки.
Я нашел что-то в .net, но не смог заставить его работать в Java ...
IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));
wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
Есть какие-нибудь мысли?
Ответы:
Попробуйте этот код:
Приведенный выше код будет ждать до 10 секунд для загрузки страницы. Если загрузка страницы превышает время, она выдаст
TimeoutException
. Вы ловите исключение и выполняете свои потребности. Я не уверен, завершает ли он загрузку страницы после сгенерированного исключения. я еще не пробовал этот код Хочешь просто попробовать.Это неявное ожидание. Если вы установите его один раз, он будет иметь область действия до тех пор, пока экземпляр Web Driver не будет уничтожен.
Смотрите документацию для
WebDriver.Timeouts
получения дополнительной информации.источник
Ваше предлагаемое решение только ожидает сигнала DOM
readyState
complete
. Но Селен по умолчанию пытается ждать тех , кто (и немного больше) на загрузке страницы с помощьюdriver.get()
иelement.click()
методов. Они уже блокируются, они ждут полной загрузки страницы, и они должны работать нормально.Проблема, очевидно, заключается в переадресации с помощью запросов AJAX и запуска скриптов - Selenium не может их перехватить, он не ждет их завершения. Кроме того, вы не можете надежно их перехватить
readyState
- он немного ждет, что может быть полезно, но он будет сигнализироватьcomplete
задолго до того, как будет загружен весь контент AJAX.Не существует общего решения, которое бы работало везде и для всех, поэтому это сложно, и каждый использует что-то немного другое.
Общее правило состоит в том, чтобы полагаться на WebDriver, который выполняет свою часть работы, затем использовать неявные ожидания, а затем использовать явные ожидания для элементов, которые вы хотите утверждать на странице, но есть гораздо больше методов, которые можно применить. Вам следует выбрать тот (или их комбинацию из нескольких), который лучше всего работает в вашем случае, на вашей протестированной странице.
См. Мои два ответа по этому поводу для получения дополнительной информации:
источник
element.click()
звонки.Это рабочая Java-версия приведенного вами примера:
Пример для C #:
источник
import com.google.common.base.Predicate
Вот моя попытка полностью универсального решения на Python:
Во-первых, общая функция ожидания (используйте WebDriverWait, если хотите, я считаю их уродливыми):
Далее, решение основывается на том факте, что селен записывает (внутренний) id-номер для всех элементов на странице, включая
<html>
элемент верхнего уровня . Когда страница обновляется или загружается, она получает новый элемент html с новым идентификатором.Итак, предположим, что вы хотите щелкнуть ссылку с текстом «моя ссылка», например:
Чтобы получить больше универсального помощника многократного использования на Python, вы можете создать диспетчер контекста:
И затем вы можете использовать его практически для любого взаимодействия с селеном:
Я считаю, что это пуленепробиваемое! Что вы думаете?
Больше информации в блоге об этом здесь
источник
У меня была похожая проблема. Мне нужно было подождать, пока мой документ не будет готов, но также и до завершения всех вызовов Ajax. Второе условие оказалось трудно обнаружить. В конце концов я проверил активные вызовы Ajax, и это сработало.
Javascript:
Полный метод C #:
источник
document.readyState == 'complete' && jQuery.active == 0
React?источник
Для C # NUnit вам необходимо преобразовать WebDriver в JSExecuter, а затем выполнить сценарий, чтобы проверить, завершено ли состояние document.ready или нет. Проверьте код ниже для справки:
Это будет ждать, пока условие не будет выполнено или не истечет время ожидания.
источник
При начальной загрузке страницы я заметил, что «разворачивание» окна браузера практически ожидает завершения загрузки страницы (включая источники).
Заменить:
С участием:
чем использовать:
Это загрузит страницу, дождется завершения, развернется и сфокусируется на ней. Я не знаю, почему это так, но это работает.
Если вы хотите дождаться загрузки страницы после щелчка по следующей или любому другому триггеру навигации по странице, кроме «Navigate ()», ответ Бена Дайера (в этой ветке) выполнит свою работу.
источник
Взгляните на веб-фреймворк для гобеленов . Вы можете скачать исходный код здесь.
Идея состоит в том, чтобы сигнализировать о том, что страница готова, с помощью атрибута html тела. Вы можете использовать эту идею, игнорируя сложные судебные дела.
А затем создайте расширение Selenium webdriver (согласно структуре гобелена)
Используйте расширение ElementIsDisplayed, написанное Алистером Скоттом .
И наконец создайте тест:
источник
Ответ Бена Драйера не компилировался на моей машине (
"The method until(Predicate<WebDriver>) is ambiguous for the type WebDriverWait"
).Рабочая версия Java 8:
Версия Java 7:
источник
Я попробовал этот код, и он у меня работает. Я вызываю эту функцию каждый раз, когда перехожу на другую страницу
источник
В Nodejs вы можете получить это через обещания ...
Если вы напишете этот код, вы можете быть уверены, что страница будет полностью загружена, когда вы перейдете к then ...
Если вы напишете этот код, вы будете перемещаться, а селен будет ждать 3 секунды ...
Из документации Selenium:
this.get (url) → Thenable
Планирует команду для перехода по заданному URL-адресу.
Возвращает обещание, которое будет разрешено после завершения загрузки документа .
Документация по Selenium (Nodejs)
источник
Ожидание события document.ready - это не полное решение этой проблемы, потому что этот код все еще находится в состоянии гонки: иногда этот код запускается до обработки события щелчка, поэтому он напрямую возвращается, так как браузер не запустился загрузка новой страницы пока нет.
После некоторого поиска я нашел сообщение об Obay the testing goat , в котором есть решение этой проблемы. Код C # для этого решения выглядит примерно так:
`Я запускаю этот метод сразу после driver.navigate.gotourl, чтобы он как можно скорее получил ссылку на страницу. Веселитесь с этим!
источник
нормально, когда селен открывает новую страницу с помощью методов click или submit или get, он будет ждать, пока страница не загружена, но проблема в том, что когда на странице есть вызов xhr (ajax), он никогда не будет ждать загрузки xhr, поэтому создание нового метода для мониторинга xhr и ожидания их будет хорошо.
if $.active == 0
поэтому нет активного вызова xhrs (который работает только с jQuery). для вызова javascript ajax вам необходимо создать переменную в своем проекте и смоделировать ее.источник
Вы можете написать логику, чтобы справиться с этим. Я написал метод, который вернет,
WebElement
и этот метод будет вызываться три раза, или вы можете увеличить время и добавить нулевую проверку дляWebElement
Вот примеристочник
Я выполнил код javascript, чтобы проверить, готов ли документ. Сэкономила мне много времени на отладку тестов на селен для сайтов с рендерингом на стороне клиента.
}
источник
источник
Как Рубанов писал для C #, я пишу для Java, и это:
источник
В Java это будет примерно так: -
источник
return document.readyState == 'loaded' || return document.readyState == 'complete'
Следующий код, вероятно, должен работать:
источник
Если у вас медленная страница или сетевое соединение, скорее всего, ничего из вышеперечисленного не сработает. Я перепробовал их все, и единственное, что у меня сработало, - это дождаться последнего видимого элемента на этой странице. Возьмем, к примеру, веб-страницу Bing. Они поместили значок КАМЕРА (кнопка поиска по изображению) рядом с основной кнопкой поиска, которая видна только после загрузки всей страницы. Если все сделали это, то все, что нам нужно сделать, это использовать явное ожидание, как в примерах выше.
источник
источник
Вот нечто подобное в Ruby:
источник
Вы можете оставить поток в спящем режиме, пока страница не будет перезагружена. Это не лучшее решение, потому что вам нужно знать, сколько времени требуется для загрузки страницы.
источник
Я проверил, что загрузка страницы завершена, работает в Selenium 3.14.0
источник
Для людей, которым нужно дождаться появления определенного элемента. (используется C #)
Затем, если вы хотите подождать, например, если в DOM существует class = "error-message", вы просто выполните:
Тогда для id это будет
WaitForElement(driver, By.Id("yourid"));
источник
Вы используете Angular? Если это так, возможно, веб-драйвер не распознает, что асинхронные вызовы завершены.
Рекомендую посмотреть на Paul Hammants ngWebDriver . Может пригодиться метод waitForAngularRequestsToFinish ().
источник