gpt4 book ai didi

python - 使用 Chrome 时的 Selenium "selenium.common.exceptions.NoSuchElementException"

转载 作者:太空宇宙 更新时间:2023-11-03 21:27:44 26 4
gpt4 key购买 nike

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

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 的功能在 headless 模式下运行 webgl 游戏,所以我无法真正切换到 Firefox。

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

最佳答案

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.exceptions , NoSuchElementException应包含以下参数:

  • 消息、屏幕、堆栈跟踪

        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 中的任何元素.
  • 您采用的定位器策略无法识别该元素,因为它不在浏览器的 Viewport 内.
  • 您采用的定位器策略标识了该元素,但由于属性style="display: none;"的存在而不可见。
  • 您采用的定位器策略无法唯一标识HTML DOM中所需的元素,并且当前会找到一些其他隐藏/不可见元素。
  • 您尝试查找的WebElement位于 <iframe> 内标签。
  • 即使在 HTML DOM 中出现/可见该元素之前,WebDriver 实例也会寻找 WebElement
<小时/>

解决方案

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

  • 采用Locator Strategy它唯一标识所需的WebElement。您可以借助开发人员工具(Ctrl+Shift+IF12)并使用元素检查器

    在这里您可以找到关于 how to inspect element in selenium3.6 as firebug is not an option any more for FF 56? 的详细讨论

  • 使用 execute_script() 滚动元素查看的方法如下:

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

    在这里您可以找到关于 Scrolling to top of the page in Python using Selenium 的详细讨论

  • 如果元素具有属性style="display: none;",请通过 executeScript() 删除该属性方法如下:

    elem = driver.find_element_by_xpath("element_xpath")
    driver.execute_script("arguments[0].removeAttribute('style')", elem)
    elem.send_keys("text_to_send")
  • 检查元素是否在 <iframe> 内向上遍历 HTML 以找到相应的 <iframe>标签和switchTo()通过以下任一方法获取所需的iframe:

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

    在这里您可以找到关于 How can I select a html element no matter what frame it is in in selenium? 的详细讨论.

  • 如果该元素未立即在 HTML DOM存在/可见,则引发 WebDriverWaitexpected_conditions设置为正确的方法如下:

    • 等待presence_of_element_located :

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

      element = WebDriverWait(driver, 20).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "element_css")
    • 等待element_to_be_clickable :

      element = WebDriverWait(driver, 20).until(expected_conditions.element_to_be_clickable((By.LINK_TEXT, "element_link_text")))
<小时/>

此用例

您正在看到NoSuchElementException因为id定位器不能唯一地标识 Canvas 。识别 Canvas 和 click()在上面你必须等待 Canvas 成为clickable为了实现这一点,您可以使用以下代码块:

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

引用

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

关于python - 使用 Chrome 时的 Selenium "selenium.common.exceptions.NoSuchElementException",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53743179/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com