Ожидаемые условия Selenium - ожидание появления xpath - я не знаю, как напечатать его в моем коде

Я Скотт, все еще новичок в Python, все еще пытаюсь понять, как все это работает...LOL

У меня есть скрипт, который заходит на веб-сайт для работы, делает несколько нажатий на несколько объектов, а затем извлекает отчет на основе тех настроек, которые были нажаты

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

Я не понимаю явного использования ожидания

в настоящее время код уродлив с моим плохим использованием time.sleep и других различных вещей..

Код включен ниже... но вот пример того, что мне нужно, чтобы он ожидал, мне нужно вставить явные ожидания, которые будут ждать, когда элемент станет доступным

Заранее спасибо за вашу помощь. С помощью этого форума я решил немало других моих проблем в сценарии.

#Close City Arrow
print('Close City')
loc_arrow2 = (browser.find_element_by_xpath('//*[@id="rddlLocation_Arrow"]'))
loc_arrow2.click()

time.sleep(2)

#Category Button
print ('Category Button')
CategoryRadioBtn = browser.find_element_by_id('rbnSearchCategory')
CategoryRadioBtn.click()
WebDriverWait(browser,20)

time.sleep(2)

#L1 Set to 3d_blah_blah_blah
print('L1 Set to 3d_blah_blah_blah')

loc_L1 = (browser.find_element_by_xpath('//*[@id="ctlCategorySelect1_ddlCategory1_Arrow"]'))
loc_L1.click()


time.sleep(2)

loc_L2 = (browser.find_element_by_xpath('//*[@id="ctlCategorySelect1_ddlCategory1_Input"]'))
loc_L2.clear()
loc_L2.send_keys('3')
loc_L2.send_keys(u'\ue007')

1 ответ

Давайте возьмем следующую строку в качестве образца, чтобы объяснить ЕС (ожидаемое состояние).

loc_L1 = (browser.find_element_by_xpath('//*[@id="ctlCategorySelect1_ddlCategory1_Arrow"]'))

Вы должны добавить ниже импорт для работы с явным ожиданием, используя EC.

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

И вот как вы должны написать явное ожидание

WebDriverWait(driver,waitTimeInSec).until(EC.presence_of_element_located((By.strategy,"xpath_goes_here")))
# Below is the example
loc_L1 = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH,'//*[@id="ctlCategorySelect1_ddlCategory1_Arrow"]')))
 # if you want to wait for the element to be clickable then use below.
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,'//*[@id="ctlCategorySelect1_ddlCategory1_Arrow"]')))

В случае, если вы получите ElementNotInteractable исключение, затем используйте js click, как показано ниже.

driver.execute_script("arguments[0].click()",loc_L1)
Другие вопросы по тегам