硒“selenium.common.exceptions.NoSuchElementException”使用 Chrome 时

发布于 2025-01-09 17:33:25 字数 1075 浏览 8 评论 0原文

我尝试在 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。

有什么解决方法可以使其正常工作吗?

I'm trying to play QWOP using Selenium on Chrome but I keep getting the following error:

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)

while using the following code:

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")

The same code works perfectly on Firefox, but because I want to use chrome's capability to run an webgl game in headless mode I can't really switch to Firefox.

Any workarounds to get this working?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

窗影残 2025-01-16 17:33:25

NoSuchElementException

selenium.common.exceptions.NoSuchElementException 通常称为 NoSuchElementException 定义为:

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

NoSuchElementException 基本上在以下两种情况下抛出:

  • 使用时:

    webdriver.find_element_by_*("表达式")
    //示例:my_element = driver.find_element_by_xpath("xpath_expression")
    
  • 使用时:

    element.find_element_by_*("表达式")
    //示例:my_element = element.find_element_by_*(“表达式”)
    

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

  • 消息、屏幕、堆栈跟踪

     引发异常类(消息、屏幕、堆栈跟踪)
    selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法定位元素:{“method”:“xpath”,“selector”:“。//*[@id='create-portal-popup']/ div[4]/div[1]/按钮[3]"}
      (会话信息:chrome=61.0.3163.100)
      (驱动程序信息:chromedriver=2.32.498550 (9dec58e66c31bcc53a9ce3c7226f0c1c5810906a),platform=Windows NT 10.0.10240 x86_64)
    

Reason

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

  • 您采用的定位器策略未识别任何HTML DOM 中的元素。
  • 您采用的定位器策略无法识别该元素,因为它不在浏览器的视口
  • 您采用的定位器策略标识了该元素,但由于属性style="display: none;"的存在而不可见。
  • 您采用的定位器策略不能唯一标识HTML DOM中所需的元素,并且目前发现了一些其他隐藏元素em> / 不可见元素。
  • 您尝试查找的 WebElement 位于 标记内。
  • 即使在 HTML DOM 中存在/可见元素之前,WebDriver 实例也会查找 WebElement

解决方案

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


这个用例

您看到的 NoSuchElementException 因为 id 定位器无法唯一标识canvas。要识别画布并对其进行 click() 操作,您必须等待 canvas 变为可点击,并且可以使用以下命令代码块:

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

参考

你可以找到Selenium 基于客户端的相关讨论:

NoSuchElementException

selenium.common.exceptions.NoSuchElementException popularly known as NoSuchElementException is defined as :

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

NoSuchElementException is basically thrown in 2 cases as follows :

  • When using :

    webdriver.find_element_by_*("expression")
    //example : my_element = driver.find_element_by_xpath("xpath_expression")
    
  • When using :

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

As per the API Docs just like any other selenium.common.exceptions, NoSuchElementException should contain the following parameters :

  • msg, screen, stacktrace

        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)
    

Reason

The reason for NoSuchElementException can be either of the following :

  • The Locator Strategy you have adopted doesn't identifies any element in the HTML DOM.
  • The Locator Strategy you have adopted is unable to identify the element as it is not within the browser's Viewport.
  • The Locator Strategy you have adopted identifies the element but is invisible due to presence of the attribute style="display: none;".
  • The Locator Strategy you have adopted doesn't uniquely identifies the desired element in the HTML DOM and currently finds some other hidden / invisible element.
  • The WebElement you are trying to locate is within an <iframe> tag.
  • The WebDriver instance is looking out for the WebElement even before the element is present/visibile within the HTML DOM.

Solution

The solution to address NoSuchElementException can be either of the following :

  • Adopt a Locator Strategy which uniquely identifies the desired WebElement. You can take help of the Developer Tools (Ctrl+Shift+I or F12) and use Element Inspector.

    Here you will find a detailed discussion on how to inspect element in selenium3.6 as firebug is not an option any more for FF 56?

  • Use execute_script() method to scroll the element in to view as follows :

    elem = driver.find_element_by_xpath("element_xpath")
    driver.execute_script("arguments[0].scrollIntoView();", elem)
    

    Here you will find a detailed discussion on Scrolling to top of the page in Python using Selenium

  • Incase element is having the attribute style="display: none;", remove the attribute through executeScript() method as follows :

    elem = driver.find_element_by_xpath("element_xpath")
    driver.execute_script("arguments[0].removeAttribute('style')", elem)
    elem.send_keys("text_to_send")
    
  • To check if the element is within an <iframe> traverse up the HTML to locate the respective <iframe> tag and switchTo() the desired iframe through either of the following methods :

    driver.switch_to.frame("iframe_name")
    driver.switch_to.frame("iframe_id")
    driver.switch_to.frame(1) // 1 represents frame index
    

    Here you can find a detailed discussion on How can I select a html element no matter what frame it is in in selenium?.

  • If the element is not present/visible in the HTML DOM immediately, induce WebDriverWait with expected_conditions set to proper method as follows :

    • To wait for presence_of_element_located :

      element = WebDriverWait(driver, 20).until(expected_conditions.presence_of_element_located((By.XPATH, "element_xpath']")))
      
    • To wait for visibility_of_element_located :

      element = WebDriverWait(driver, 20).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "element_css")
      
    • To wait for element_to_be_clickable :

      element = WebDriverWait(driver, 20).until(expected_conditions.element_to_be_clickable((By.LINK_TEXT, "element_link_text")))
      

This Usecase

You are seeing NoSuchElementException because the id locator doesn't identifies the canvas uniquely. To identify the canvas and click() on it you have to wait for the canvas to be clickable and to achieve that you can use the following code block :

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

Reference

You can find Selenium's client based relevant discussion in:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文