Python WebDriverWait抛出TimeoutException,为什么?
我正在制作一个小程序,自动填写Del Taco的快餐调查,这样我下次购买时就可以省下1美元。为此,我在python中使用SeleniumWebDriver,它工作得很好,只是有一个小问题,其中有一个页面有时显示,有时不显示 我试图告诉是否额外的页面显示了这个函数在这里,这应该是检测哪个信号装置ID的显示Python WebDriverWait抛出TimeoutException,为什么?,python,selenium,selenium-webdriver,Python,Selenium,Selenium Webdriver,我正在制作一个小程序,自动填写Del Taco的快餐调查,这样我下次购买时就可以省下1美元。为此,我在python中使用SeleniumWebDriver,它工作得很好,只是有一个小问题,其中有一个页面有时显示,有时不显示 我试图告诉是否额外的页面显示了这个函数在这里,这应该是检测哪个信号装置ID的显示 def whichID(id1, id2): def find(driver): if driver.find_element_by_id(id1):
def whichID(id1, id2):
def find(driver):
if driver.find_element_by_id(id1):
return id1
if driver.find_element_by_id(id2):
return id2
# if neither id is found
return False
try:
print 'waiting'
id = WebDriverWait(driver, timeout).until(find)
print 'done waiting'
return id
except TimeoutException:
print 'timeout exception'
return False
id = whichID("option_745653_340084", "option_522363_247141")
if (id == "option_745653_340084"):
# final page
clickBy('id', "option_745653_340084")
else:
# demographics page
clickBy('id', "option_522363_247141")
clickBy('id', "option_522373_247142")
nextButton.click()
#final page
clickBy('id', "option_745653_340084")
这确实有效,但任何时候出现额外页面(我称之为人口统计页面)时,都需要额外的5秒钟才能进入最后一页(我将超时设置为5
)。正如您在上面看到的,我用一些打印语句检查了它,它看起来是WebDriverWait
每次出现人口统计页面时都抛出一个TimeoutException
。我不明白为什么。很明显,ID显示在页面上,为什么会超时
作为参考,程序是否在当前迭代中?我认为这是问题的根本原因:
if driver.find_element_by_id(id1):
return id1
if driver.find_element_by_id(id2):
return id2
return False
它不像你期望的那样工作。。。如果driver.find\u element\u by\u id(id1)
未找到元素,则不会切换到下一个If
块,但会得到一个异常,该异常将由除
块处理<代码>返回False
将永远不会执行
我会这样做:
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# First option
def whichID(id1, id2):
id_value = None
try:
WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.ID, id1)))
id_value = id1
except TimeoutException:
try:
WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.ID, id2)))
id_value = id2
except TimeoutException:
print("No nodes found")
return id_value
# Second option
def whichID(id1, id2):
try:
id_value = WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.XPATH, "//*[@id='{0}' or @id='{1}']".format(id1, id2)))).get_attribute("id")
return id_value
except TimeoutException:
return None
id_value = whichID("option_745653_340084", "option_522363_247141")
注意,
id()
是一个Python内置函数。您不应该使用“id”
作为变量名我认为这是问题的根本原因:
if driver.find_element_by_id(id1):
return id1
if driver.find_element_by_id(id2):
return id2
return False
它不像你期望的那样工作。。。如果driver.find\u element\u by\u id(id1)
未找到元素,则不会切换到下一个If
块,但会得到一个异常,该异常将由除
块处理<代码>返回False将永远不会执行
我会这样做:
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# First option
def whichID(id1, id2):
id_value = None
try:
WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.ID, id1)))
id_value = id1
except TimeoutException:
try:
WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.ID, id2)))
id_value = id2
except TimeoutException:
print("No nodes found")
return id_value
# Second option
def whichID(id1, id2):
try:
id_value = WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.XPATH, "//*[@id='{0}' or @id='{1}']".format(id1, id2)))).get_attribute("id")
return id_value
except TimeoutException:
return None
id_value = whichID("option_745653_340084", "option_522363_247141")
注意,
id()
是一个Python内置函数。您不应该使用“id”
作为变量名非常感谢!这解决了我的问题。谢谢你关于id
的留言。非常感谢!这解决了我的问题。谢谢你关于id
的注释。