Как вы упомянули, если есть какая-либо универсальная функция, чтобы проверить, полностью ли загружена страница в Selenium_, ответ будет Нет .
Сначала давайте взглянем на пробную версию кода, котораявыглядит следующим образом:
new WebDriverWait(firefoxDriver, pageLoadTimeout).until(webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));
Параметр pageLoadTimeout
в приведенной выше строке кода на самом деле не похож на фактический pageLoadTimeout () .
Здесь вы можетеподробное обсуждение pageLoadTimeout в Selenium не работает
Теперь, когда ваш сценарий использования относится к полностью загруженной странице, вы можете использовать pageLoadStrategy () установлен на normal
[поддерживаемые значения: none , eager или normal ], используя либо через экземпляр DesiredCapabilities Класс или ChromeOptions Класс следующим образом:
Использование DesiredCapabilities Класс:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
public class myDemo
{
public static void main(String[] args) throws Exception
{
System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
DesiredCapabilities dcap = new DesiredCapabilities();
dcap.setCapability("pageLoadStrategy", "normal");
FirefoxOptions opt = new FirefoxOptions();
opt.merge(dcap);
WebDriver driver = new FirefoxDriver(opt);
driver.get("https://www.google.com/");
System.out.println(driver.getTitle());
driver.quit();
}
}
Использование ChromeOptions Класс:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.PageLoadStrategy;
public class myDemo
{
public static void main(String[] args) throws Exception
{
System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
FirefoxOptions opt = new FirefoxOptions();
opt.setPageLoadStrategy(PageLoadStrategy.NORMAL);
WebDriver driver = new FirefoxDriver(opt);
driver.get("https://www.google.com/");
System.out.println(driver.getTitle());
driver.quit();
}
}
Подробное обсуждение можно найти в Стратегия загрузки страницы для драйвера Chrome (Обновлено до Selenium v3.12.0)
Теперь настройка PageLoadStrategy NORMAL , и ваша пробная версия кода гарантирует, что Browser Client (т. е. Web Browser ) достиг 'document.readyState'
, равного "complete"
.Как только это условие выполнено, Selenium выполняет следующую строку кода.
Подробное обсуждение можно найти в Selenium IE WebDriver работает только при отладке
Но Клиент браузера , набравший 'document.readyState'
, равный "complete"
, по-прежнему не гарантирует завершения всех вызовов Ajax 1079 * и .
Чтобы дождаться завершения всех вызовов JavaScript и Ajax , вы можете написать функцию следующим образом:
public void WaitForAjax2Complete() throws InterruptedException
{
while (true)
{
if ((Boolean) ((JavascriptExecutor)driver).executeScript("return jQuery.active == 0")){
break;
}
Thread.sleep(100);
}
}
Подробное обсуждение можно найти в Дождитесь завершения ajax-запроса - selenium webdriver
Теперь два вышеуказанных подхода через PageLoadStrategy и "return jQuery.active == 0"
выглядят ожидающими неопределенных событий.Таким образом, для определенного ожидания вы можете вызвать WebDriverWait несоответствие с ExpectedConditions , установленным на titleContains () метод, который будет гарантировать, что Page Title (то есть веб-страница ) видима и предполагает, что все элементы также видны следующим образом:
driver.get("https://www.google.com/");
new WebDriverWait(driver, 10).until(ExpectedConditions.titleContains("partial_title_of_application_under_test"));
System.out.println(driver.getTitle());
driver.quit();
Теперь иногда это возможно, хотя PageЗаголовок будет соответствовать вашему Заголовку приложения , однако желаемый элемент, с которым вы хотите взаимодействовать, еще не загружен.Таким образом, более детальный подход заключается в том, чтобы вызвать WebDriverWait несоответствие с ExpectedConditions , установленным в visibilityOfElementLocated () метод, который заставит вашу программу ждать требуемый элемент быть видимым следующим образом:
driver.get("https://www.google.com/");
WebElement ele = new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("xpath_of_the_desired_element")));
System.out.println(ele.getText());
driver.quit();