Python For循环和递归中的Selenium返回错误

gkl3eglg  于 2023-02-04  发布在  Python
关注(0)|答案(1)|浏览(139)

我尝试使用selenium来遍历字符串列表,并使用Google Chrome搜索列表中的每个元素。
下面是我使用递归创建的代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome(executable_path="/Applications/Google_Chrome.app")
driver.implicitly_wait(0.5)

file1 = open('questions.txt', 'r')
File = file1.readlines()

driver.get("https://www.google.com/")
m = driver.find_element("name", "q")

def runSearches(list):
    if list:
        m = driver.find_element("name", "q")
        m.send_keys(list[0])
        time.sleep(0.2)
        m.send_keys(Keys.ENTER)
        time.sleep(0.2)
        driver.back()
        time.sleep(0.2)
        return runSearches(list[1:])
    else:
        print("done")

runSearches(File)

当我运行这段代码时,它只对列表中的第一项有效,但是,在搜索之后,selenium忽略了driver.back(),不返回下一页,并返回以下代码:

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

我理解这个问题的原因。页面不返回,因此selenium正在查找当前页面上不存在的元素。我不理解的是为什么selenium不返回页面。无论我在命令之间设置多长时间的睡眠时间,总是出现相同的结果。使用driver.get(“https://www.google.com/“)代替driver.back()不起作用。
我曾尝试使用for循环实现这个函数的迭代版本,但没有成功,也没有结果差异。

flvlnr44

flvlnr441#

这是一个常见的问题,当selenium能够找到元素但无法再定位它时就会发生。您只需处理异常并再次捕获元素。

def runSearches(list):
    if list:
        m = None
        for _ in range(5):
            try:
                m = driver.find_element("name", "q")
                m.send_keys(list[0])
                time.sleep(0.2)
                m.send_keys(Keys.ENTER)
                time.sleep(0.2)
                driver.back()
                time.sleep(0.2)
                return runSearches(list[1:])
            except StaleElementReferenceException:
                m = driver.find_element("name", "q")

    else:
        print("done")

您需要在脚本中导入异常:

from selenium.common.exceptions import StaleElementReferenceException

您还可以考虑在查找元素时使用wait,因为不能保证在页面加载时立即加载这些元素。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

wait = WebDriverWait(driver, 15)
m = wait.until(EC.presence_of_element_located((By.NAME, 'q')))

相关问题