Причинна причина: Щоразу, коли ви завантажуєте якусь сторінку за допомогою драйвера селену, тоді driver
сценарій очікування до повного завантаження сторінки. Але колись webdriver потребує більше часу для завантаження сторінки, у такому випадку ви побачите TimeoutException
виняток у своїй консолі.
Рішення: Коли завантаження сторінки займає занадто багато часу, і вам потрібно припинити завантаження додаткових субресурсів (зображень, css, js тощо), ви можете змінити сторінкуLoadStrategy через веб-диск.
Нижче коду просто завантажте вміст html зі сторінки. Ви можете встановити стратегію завантаження сторінки за допомогою chromeoptions
ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.NONE);
Оновлене рішення -2: Я згоден з DebanjanB, стратегія PageLoad з None, без завантаження додаткових файлів (зображень, css, js тощо) не є хорошою ідеєю під час проведення тестування. Я шукав всю проблему з цього приводу і намагався знайти правильне рішення. Я спробував нижче варіантів, оскільки колись у якийсь момент вдалося вирішити цю проблему.
options.addArguments("start-maximized");
options.addArguments("enable-automation");
options.addArguments("--no-sandbox");
options.addArguments("--disable-infobars");
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--disable-browser-side-navigation");
options.addArguments("--disable-gpu");
Жоден з них не допоміг. Але я знову знайшов одне рішення зі стратегією завантаження сторінки. Цього разу ми завантажуємо всі субресурси, але чекаємо події DOMContentLoaded . Ця стратегія називається Eager . Невелике визначення доступних усіх 3 стратегій завантаження сторінки
1. нормально:
Ця стратегія змушує Selenium дочекатися повного завантаження сторінки (завантаження та аналіз синтаксису та допоміжних ресурсів html).
2. нетерплячий:
ця стратегія змушує Selenium чекати події DOMContentLoaded (вміст, завантажений і розроблений html).
3. немає:
Ця стратегія викликає повернення Selenium одразу після повного отримання початкового вмісту сторінки (завантажений вміст html).
ПРИМІТКА. За замовчуванням, коли Selenium завантажує сторінку, вона дотримується звичайної сторінкиLoadStrategy.
Фрагмент коду без використання стратегії завантаження сторінки (або Звичайний, як використовується селен за замовчуванням)
System.setProperty("webdriver.chrome.driver", "C:\\Users\\...\\LatestDriver\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.get("http://www.google.com");
driver.manage().window().maximize();
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement el = wait.until(ExpectedConditions.elementToBeClickable(By.name("q")));
el.click();
List <WebElement> allLinks = driver.findElements(By.tagName("a"));
System.out.println(allLinks.size());
driver.quit();
Вихід з консолі:
Запуск ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs / branch-heads / 3987 @ {# 185}) на порту 41540 Дозволено лише локальне з'єднання. Будь ласка, захистіть порти, які використовує ChromeDriver та пов’язані з ними тестові рамки для запобігання доступу шкідливим кодом. 11 лютого 2020 10:22:12 AM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Виявлений діалект: W3C [1581412933.937] [SEVERE]: Визначено прийом повідомлення від рендерінга: 0.100 [1581412934.066] [СЕВЕР]: Вимкнено отримання повідомлення від рендерінга: 0.100 [1581412934.168] [СЕВЕРЕ]: Вимкнено прийом повідомлення від рендерінга: 0.100 [1581412934.360] [СЕВЕРЕ]: Вимкнено прийом повідомлення від рендерінга: 0.100 [1581412934.461] [СЕВЕРЕ]: Вимкнено прийом повідомлення від рендерінга: 0,100 [1581412934.618] [СЕВЕР]:
За допомогою стратегії завантаження сторінки - прагнення:
Фрагмент коду:
System.setProperty("webdriver.chrome.driver", "C:\\Users\\...\\LatestDriver\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.EAGER);
WebDriver driver=new ChromeDriver(options);
driver.get("http://www.google.com");
driver.manage().window().maximize();
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement el = wait.until(ExpectedConditions.elementToBeClickable(By.name("q")));
el.click();
List <WebElement> allLinks = driver.findElements(By.tagName("a"));
System.out.println(allLinks.size());
driver.quit();
Вихід з консолі:
Запуск ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs / branch-heads / 3987 @ {# 185}) на порту 1175 Дозволено лише локальне з'єднання. Будь ласка, захистіть порти, які використовує ChromeDriver та пов'язані з ними тестові рамки, щоб запобігти доступу шкідливим кодом. 11 лютого 2020 р. 10:29:05 org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Виявлений діалект: W3C
21