Python Selenium нажатие нескольких кнопок с явным ожиданием - PullRequest
0 голосов
/ 03 августа 2020

Для этого сайта https://www.sportstats.ca/display-results.xhtml?raceid=9381 Я пытаюсь нажать все эти кнопки с плюсом: введите описание изображения здесь

Я пробовал это, и он работает, но time.sleep() явно stati c, и я не хочу этого:

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

PATH = pathtochromedriver
driver = webdriver.Chrome(PATH)
driver.get("https://www.sportstats.ca/display-results.xhtml?raceid=9381")

buttons = driver.find_elements_by_class_name('ui-row-toggler.ui-icon.ui-icon-circle-triangle-e')

for button in buttons:
    button.click()
    time.sleep(0.6)

Для явного ожидания я попробовал это и Я получил ElementClickInterceptedException:

buttons_wait = WebDriverWait(driver, 10).until(
           EC.presence_of_all_elements_located((By.CLASS_NAME, 'ui-row-toggler.ui-icon.ui-icon- 
circle- triangle-e'))
)

for button in buttons_wait:
    button.click()

Как я могу нажать на все кнопки с явным ожиданием?

1 Ответ

0 голосов
/ 03 августа 2020

presence_of_all_elements_located () найдет все элементы, присутствующие в DOM, независимо от того, видны они на странице или нет. Вместо этого используйте visibility_of_all_elements_located (), который ждет, пока элемент не станет видимым на странице.

driver.get("https://www.sportstats.ca/display-results.xhtml?raceid=9381")

buttons_wait = WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CLASS_NAME, 'ui-row-toggler.ui-icon.ui-icon-circle-triangle-e'))
)
for button in buttons_wait:
    button.click()
    time.sleep(0.6)

Используйте класс действий , чтобы сначала перейти к этому элементу, а затем щелкните.

driver.get("https://www.sportstats.ca/display-results.xhtml?raceid=9381")

buttons_wait = WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CLASS_NAME, 'ui-row-toggler.ui-icon.ui-icon-circle-triangle-e'))
)
for button in buttons_wait:
    ActionChains(driver).move_to_element(button).click().perform()

Вам необходимо импортировать ниже librar ie.

from selenium.webdriver.common.action_chains import ActionChains
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...