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

时间:2018-08-02 13:15:55

标签: 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. 如何在click()之后等待下一页/图像的全部加载(我是 使用time.sleep)?

1 个答案:

答案 0 :(得分:1)

您可以使用WebDriverWait

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

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