使用 Chrome 时的 Selenium “selenium.common.exceptions.NoSuchElementException”

Selenium "selenium.common.exceptions.NoSuchElementException" when using Chrome

提问人:valorcurse 提问时间:12/27/2017 最后编辑:undetected Seleniumvalorcurse 更新时间:3/2/2020 访问量:14835

问:

我正在尝试在 Chrome 上使用 Selenium 玩 QWOP,但不断收到以下错误:

selenium.common.exceptions.NoSuchElementException: 
Message: no such element: Unable to locate element
{"method":"id","selector":"window1"
(Session info: chrome=63.0.3239.108
(Driver info: chromedriver=2.34.522913
(36222509aa6e819815938cbf2709b4849735537c), platform=Linux 4.10.0-42-generic x86_64)

使用以下代码时:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

browser = webdriver.Chrome()
browser.set_window_size(640, 480)
browser.get('http://www.foddy.net/Athletics.html?webgl=true')
browser.implicitly_wait(10)

canvas = browser.find_element_by_id("window1")

canvas.click()

while (True):
    action = ActionChains(browser)
    action.move_to_element(canvas).perform()
    canvas.click()
    canvas.send_keys("q")

同样的代码在 Firefox 上完美运行,但由于我想使用 chrome 的功能在无头模式下运行 webgl 游戏,所以我无法真正切换到 Firefox。

有什么解决方法可以解决这个问题吗?

python selenium selenium-webdriver webdriver nosuchelementexception

评论


答:

16赞 undetected Selenium 12/28/2017 #1

NoSuchElementException

selenium.common.exceptions.NoSuchElementException,俗称,定义为:NoSuchElementException

exception selenium.common.exceptions.NoSuchElementException(msg=None, screen=None, stacktrace=None)

NoSuchElementException基本上分为以下两种情况:

  • 使用时:

    webdriver.find_element_by_*("expression")
    //example : my_element = driver.find_element_by_xpath("xpath_expression")
    
  • 使用时:

    element.find_element_by_*("expression")
    //example : my_element = element.find_element_by_*("expression")
    

根据 API 文档,就像任何其他文档一样,应包含以下参数:selenium.common.exceptionsNoSuchElementException

  • 消息、屏幕、堆栈跟踪

        raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":".//*[@id='create-portal-popup']/div[4]/div[1]/button[3]"}
      (Session info: chrome=61.0.3163.100)
      (Driver info: chromedriver=2.32.498550 (9dec58e66c31bcc53a9ce3c7226f0c1c5810906a),platform=Windows NT 10.0.10240 x86_64)
    

原因

NoSuchElementException 的原因可能是以下任一原因:

  • 您采用的定位器策略不会识别 HTML DOM 中的任何元素。
  • 您采用的定位器策略无法识别该元素,因为它不在浏览器的视口中。
  • 您采用的定位器策略可识别元素,但由于存在属性 style=“display: none;”,因此该元素不可见。
  • 您采用的定位器策略不会唯一地标识 HTML DOM 中所需的元素,并且当前会找到其他一些隐藏/不可见的元素。
  • 您尝试查找的 WebElement 位于标记中。<iframe>
  • WebDriver 实例甚至在 Web Element 在 HTML DOM 中存在/可见之前就一直在寻找 WebElement

溶液

解决 NoSuchElementException 的解决方案可以是以下任一方法:


此用例

您之所以会看到,是因为 id 定位器无法唯一标识画布。要识别画布并在其上,您必须等待画布,并且要实现这一点,您可以使用以下代码块:NoSuchElementExceptionclick()clickable

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//canvas[@id='window1']"))).click()

参考

您可以在以下位置找到 Selenium 基于 客户端的相关讨论:

评论

1赞 valorcurse 12/28/2017
我复制了错误的错误,我只是用正确的错误编辑了问题,并实施了您的建议。我仍然收到同样的错误。