Selenium: использование явного ожидания в цикле

#python-3.x #selenium #selenium-webdriver

#python-3.x #selenium #selenium-webdriver

Вопрос:

Это то, как вы обычно реализуете явное ожидание элемента:

 from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))
  

В приведенном выше примере он использует идентификатор элемента для поиска элемента и ожидания, пока он станет интерактивным.

Я хочу использовать существующий объект element вместо его селектора для добавления явных ожиданий.

Пример:

 fields = driver.find_elements_by_xpath("//input")
for field in fields:
    wait.until(EC.element_to_be_clickable(field))
  

Ответ №1:

Самый простой способ — просто использовать visibility_of вместо element_to_be_clickable .

Если вам действительно нужно element_to_be_clickable (убедитесь, что элемент виден и включен), вы можете сделать что-то подобное:

 class enable_of(object):
    def __init__(self, element):
        self.element = element

    def __call__(self, ignored):
        return self.element.is_enabled()


fields = driver.find_elements_by_xpath("//input")
wait = WebDriverWait(driver, 10)
for field in fields:
    wait.until(EC.visibility_of(field))
    wait.until(enable_of(field))