Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Selenium Python在特定下拉菜单列表保存和整个列表请求之前保持特定页面的驱动程序?_Python_Selenium_Exception_Web Crawler - Fatal编程技术网

如何使用Selenium Python在特定下拉菜单列表保存和整个列表请求之前保持特定页面的驱动程序?

如何使用Selenium Python在特定下拉菜单列表保存和整个列表请求之前保持特定页面的驱动程序?,python,selenium,exception,web-crawler,Python,Selenium,Exception,Web Crawler,我为这个页面()制作了一个爬虫来收集特定制造商的库存清单。我的代码从选择搜索菜单第一行中的下拉菜单开始 每个右下拉菜单都是其左下拉菜单的子菜单。我想做的是选择每个下拉菜单中的每个第一项,然后单击“搜索”按钮进行第一次运行。在对其股票列表进行爬网之后,我设置了最后一个下拉菜单的第二项,然后单击“搜索”按钮。(如果最后一个下拉菜单中只有一个项目,则从最后一个下拉菜单转到第二个下拉菜单,并选择其中的第二个项目。) 但问题就发生在这里。我将每个下拉菜单的每个项保存为元组。当我尝试调用第二轮爬网的最后一

我为这个页面()制作了一个爬虫来收集特定制造商的库存清单。我的代码从选择搜索菜单第一行中的下拉菜单开始

每个右下拉菜单都是其左下拉菜单的子菜单。我想做的是选择每个下拉菜单中的每个第一项,然后单击“搜索”按钮进行第一次运行。在对其股票列表进行爬网之后,我设置了最后一个下拉菜单的第二项,然后单击“搜索”按钮。(如果最后一个下拉菜单中只有一个项目,则从最后一个下拉菜单转到第二个下拉菜单,并选择其中的第二个项目。)

但问题就发生在这里。我将每个下拉菜单的每个项保存为元组。当我尝试调用第二轮爬网的最后一个下拉菜单的第二项时,“StaleElementReferenceException”或“NoTouchElementException”出现,消息为“Element不再附加到DOM”。因此,我希望在每个下拉菜单迭代完成之前创建驱动器

下面是我的代码,但仍然有错误消息。我的错误通常发生在第二个while循环中。此时,我添加了一些“等待”功能和“刷新”功能。有时它可以帮助我在代码中跳出while循环,但通常它会陷入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 Select(self.driver.find_element_by_css_selector("#level2_no")).options
            if o.get_attribute('text') != '세부등급']
    except (StaleElementReferenceException, NoSuchElementException):
        print("=======Exception Found - Option2 Save=====")
        self.driver.refresh()
        self.driver.implicitly_wait(1.5)
        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:
            Select(self.driver.find_element_by_css_selector("#level2_no")).select_by_value(option2[1])

        except (StaleElementReferenceException, NoSuchElementException):
            print("=======Exception Found - Option2 Request=====")
            self.driver.refresh()
            self.driver.implicitly_wait(1.5)
            self.driver.refresh()
            continue
        break

这意味着行李将在查找元素和使用元素对象之间重新加载,确保首先加载页面,并在每次需要使用时搜索元素

额外的检查是在执行选择之前为元素添加额外的等待,因为
find_element_by_css_selector
根本不会等待元素可用


顺序应该是:页面加载>等待元素存在>对元素使用操作

感谢您的评论。那么我需要应用的“等待元素存在”函数是什么?你有什么想法吗?在这里查看python waits for selenium的列表这里有一个问题和一些示例