我正在制作一个小程序,自动填写Del Taco的快餐调查,这样我下次购买时可以获得1美元的折扣。我在python中使用Selenium WebDriver,除了一个小打嗝之外它有效地工作,有时会出现一个页面,有时候没有。
我试着告诉额外的页面是否在这里出现了这个函数,它应该检测哪个告密者ID显示
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秒钟(我将timeout
设置为{{ 1}})。如上所示,我使用了一些打印语句对其进行了检查,每次人口统计信息页面出现时,5
看起来都会WebDriverWait
。我不明白为什么。很明显,ID显示在页面上,为什么它会超时?
作为参考,here是其当前迭代中的程序
答案 0 :(得分:2)
我认为这是导致问题的根本原因:
if driver.find_element_by_id(id1):
return id1
if driver.find_element_by_id(id2):
return id2
return False
它似乎无法正常工作......如果driver.find_element_by_id(id1)
找不到该元素,则不会切换到下一个if
块,但会获得一个将被处理的异常按except
块。 {永远不会执行return 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")
P.S。请注意,id()
是Python内置函数。您不应该使用"id"
作为变量名称