selenium
Ожидание в селене
Поиск…
Вступление
Один из самых распространенных камней преткновения для новых пользователей Selenium ждет, пока страница полностью загрузится. Пользователи могут легко определить, загружена ли страница полностью или если она по-прежнему загружается. Селен, однако, просто ждет определенное количество времени. Поэтому часто бывает удобно подождать элементы на странице. Хотя это можно сделать с помощью функций loop и sleep (), в Selenium уже есть более чистые способы.
Явное ожидание на Python
Когда браузер переходит на динамическую страницу (чаще всего на веб-приложение на основе AJAX), элементы на странице могут занимать различное время для загрузки, а тем более: некоторые элементы будут загружаться только в ответ на некоторые действия пользователя. В таких случаях прямой поиск элемента может завершиться неудачей:
# Don't do this: may fail on dynamic page with ElementNotVisibleException
element = driver.find_element_by_name('q')
Наиболее очевидным решением, похоже, является ожидание перед извлечением элементов:
# Don't do this: inefficient solution for ElementNotVisibleException
time.sleep(5) # delays for 5 seconds
element = driver.find_element_by_name('q')
Но такое решение неэффективно, так как оно заставляет тест всегда ждать 5 секунд, даже если элемент в большинстве случаев появляется через 1 секунду (и только иногда требуется до 5 секунд). Это не выглядит много, если это одно место, но обычно каждый тест имеет дело с несколькими элементами, и есть несколько тестов, которые суммируются до общей продолжительности теста.
Лучшее решение - дождаться появления элемента в течение 5 секунд, но вернуться из ожидания, как только элемент будет найден. WebDriverWait
позволяет это сделать.
В следующем примере перейдите на сайт www.google.com, подождите (до 5 секунд) для загрузки строки поиска, а затем выполняется поиск «селена».
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
# Create a new chromedriver instance
driver = webdriver.Chrome()
# Go to www.google.com
driver.get("https://www.google.com")
try:
# Wait as long as required, or maximum of 5 sec for element to appear
# If successful, retrieves the element
element = WebDriverWait(driver,5).until(
EC.presence_of_element_located((By.NAME, "q")))
# Type "selenium"
element.send_keys("selenium")
#Type Enter
element.send_keys(Keys.ENTER)
except TimeoutException:
print("Failed to load search bar at www.google.com")
finally:
driver.quit()
Ожидание на Java с селеном
Явное ожидание . Подождите, пока произойдет определенное условие, прежде чем продолжить код.
WebDriver driver = new FirefoxDriver();
driver.get("http://google.com");
WebElement myElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myElement")));
Неявное ожидание. Подождите некоторое время, пытаясь найти элемент или элементы, если они не доступны сразу.
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://google.com");
WebElement myElement = driver.findElement(By.id("myElement"));