我正在使用chrome驱动程序来提取数据。
有一点我很纠结:我需要对整个列表(所有元素(进行迭代。第一次它工作,我可以下载一个文件。
对于第二次迭代,它显示了一个错误StaleElementReferenceException,其中一个元素没有附加到页面文档。
我应该如何改变我的循环来克服这个错误?
你可以尝试这样的东西:
options = browser.find_elements_by_xpath(
'/html/body/form[2]/table/tbody/tr[1]/td[1]/select/option')
for option in options:
result = option.click()
...
请参阅文档:https://selenium-python.readthedocs.io/locating-elements.html#locating-通过xpath
问题可能是点击选项会出现更多选项。你可以做这样的事情——制作一个生成器来生成以前没有找到的所有元素,直到没有剩下的元素了。(WebElements似乎不可哈希,因此不能直接存储在一个集合中,但可以通过其id
属性唯一标识,但当向页面添加新元素时,您可能需要检查这是否有效。(
def all_elements_by_xpath(xpath):
found = set()
while True:
found_new_ones = False
for element in browser.find_elements_by_xpath(xpath):
if element.id not in found:
found_new_ones = True
found.add(element.id)
yield element
if not found_any:
return
for element in all_elements_by_xpath('/html/body/form[2]/table/tbody/tr[1]/td[1]/select/option'):
element.click()
请注意,这将首先单击页面上最初出现的所有元素(按它们的出现顺序(,然后才开始单击单击后出现的新元素。如果你想要一个不同的顺序,或者元素有时会消失,你可以改变它,每次都再次搜索元素,比如:
def all_elements_by_xpath(xpath):
found = set()
while True:
for el in browser.find_elements_by_xpath(xpath):
if el.id not in found:
found.add(element.id)
yield element
break
else:
return