python - 如何处理 Selenium 中的错误(无法定位元素)

标签 python selenium selenium-webdriver click

我正在使用 Selenium 为一款需要大量点击的游戏编写机器人。 有时会显示错误无法定位元素:

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: /html/body/div/div[1]/header/div/div[1]/a

我有正确的 Xpath,但有时它会在代码的不同部分给我带来错误。并不是我有一个错误,并且总是在一处显示错误。我的问题是这些错误是随机的。我是这样处理的:

try:
    secondPhoto = self.driver.find_element_by_xpath(
                    '/html/body/span/section/main/article/div[2]/div/div[1]/div[1]')
    secondPhotoOpen = ActionChains(self.driver)
    secondPhotoOpen.move_to_element(secondPhoto)
    secondPhotoOpen.click()
    secondPhotoOpen.perform()
except:
    time.sleep(3)
    self.driver.find_element_by_xpath(
                    '/html/body/span/section/main/article/div[1]/div/div/div[1]/div[2]').click()

这不是一个理想的解决方案。它仍然显示错误,但频率较低。 我也在使用time.sleep。通常,当我在互联网上做其他事情或出现延迟时会出现错误(这就是我使用 time.sleep 的原因)现在,我有大约 50 个 .click() 在我的代码中,对于我正在尝试的所有点击,但它仍然无法正常工作。

  1. 您对此有有效的解决方案吗?如何编写使用 .click() 的代码,以 100% 确定它可以正常工作,无论滞后、其他 浏览器事件?

  2. 如何在点击()后等待下一页/图像的完全加载(我是 使用 time.sleep)?

最佳答案

您可以使用WebDriverWait:

btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "element_id")))
btn.click()

这将等待至少 10 秒,直到元素可单击,然后才单击它。我还建议阅读this 。使用 WebDriverWait,您不必进行硬编码的暂停。

关于python - 如何处理 Selenium 中的错误(无法定位元素),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51654651/

相关文章:

c# - 如何获取此 ID

java - 如何使用 Selenium RemoteWebDriver 删除下载的文件?

c# - 保存 chrome cookies Selenium

java - 我们可以在 ExplicitWait 预期条件中传递条件参数吗?

python - 在 Pandas 中签名时间增量到签名秒数

java - 在 TestNG 中注入(inject) WebDrivers @before test with @guice

javascript - 如何从 WebdriverIO 中的 WebElement 继承

Python - 使用 dash_bootstrap_components 构建描述性统计表

python - 如何防止 Python 在数据库连接失败时退出?

python - 将 while 循环转换为可重用的循环