Поиск…


Вступление

Один из самых распространенных камней преткновения для новых пользователей 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"));


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow