Python WebDriverWait抛出TimeoutException,为什么?

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):

我正在制作一个小程序,自动填写Del Taco的快餐调查,这样我下次购买时就可以省下1美元。为此,我在python中使用SeleniumWebDriver,它工作得很好,只是有一个小问题,其中有一个页面有时显示,有时不显示

我试图告诉是否额外的页面显示了这个函数在这里,这应该是检测哪个信号装置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秒钟才能进入最后一页(我将
超时设置为
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
的注释。