WebDriverWait会抛出TimeoutException,为什么?

时间:2018-04-17 19:12:22

标签: python selenium selenium-webdriver

我正在制作一个小程序,自动填写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是其当前迭代中的程序

1 个答案:

答案 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"作为变量名称