我怎样才能等到使用 Selenium Python 选择特定的下拉菜单?

How can I wait until a specific drop-down menu selected using Selenium Python?

我为这个页面(http://www.bobaedream.co.kr/cyber/CyberCar.php?gubun=I)做了一个爬虫,用来收集特定厂家的库存清单。过程是从搜索菜单上部第一行的下拉菜单select开始。

每个右侧下拉菜单都是其左侧下拉菜单的子菜单。我想要做的是 select 每个下拉菜单中的每个第一项,然后单击第一个 运行 的 "search" 按钮。爬取它的库存列表后,我设置最后一个下拉菜单的第二项,然后单击 "search" 按钮。

但是问题就出在这里。我将每个下拉菜单的每个项目保存为元组。当我尝试调用最后一个下拉菜单的第二项进行第二轮爬取时,出现"StaleElementReferenceException"或"NoSuchElementException",并出现"Element is no longer attached to the DOM"的消息。因此,我想让元素等到每个下拉迭代的整个循环完成。

下面是我的代码,但仍然有错误信息。我的错误通常发生在第二个 while 循环中。目前,我猜第二个 "try" 函数中的某种类型的 "wait.until(EC.~)" 代码可以解决这个问题,但我对此没有具体的想法。请帮助或给我任何建议。

def option2_menu_loaded(inDriver):
    path = '//select[@id="level2_no"]'
    return inDriver.find_element_by_xpath(path)

self.wait.until(option2_menu_loaded)

while True:
    try:
        select_option2_values = [
            ('%s' % o.get_attribute('text'), '%s' % o.get_attribute('value'))
            for o
            in self.getNewSelect("#level2_no").options
            if o.get_attribute('text') != '세부등급']
    except (StaleElementReferenceException, NoSuchElementException):
        print("Exception Found")
        continue
    break

for option2 in select_option2_values:
    self.csv.setCarTitle(ma, mo, de, option1[0], option2[0])

    print(option2[0], option2[1])
    self.driver.implicitly_wait(0.5)

    while True:
        try:
            self.getNewSelect("#level2_no").select_by_value(option2[1])
        except (StaleElementReferenceException, NoSuchElementException):
            self.getNewSelect("#level2_no").options
            print("Exception Found")
            continue
        break

如果您 google StaleElementException,您将看到尝试在循环中再次查找元素的解决方案。所以这是一个想法,在你上面的异常中尝试3次,每次尝试find_Element之前延迟1秒,看看这是否有帮助。

另一个想法 是在每次抓取之间刷新页面(当然不理想但它可能有效)。您可以在 Python 中使用:

driver.refresh()

最后,您还可以避免在爬行时遍历所有不同元素(这可能会导致 StaleElementException),因为 Selenium 对此有解决方案。您可以在 tuple/array 中保存所有内容,而无需通过 使用 find_ElementS 而不是 遍历每条记录find_ElemenT。试试这个,看看它是否能提高您的整体表现:

a=[];
a = driver.find_elements_by_xpath(path)

祝你好运!