提问人:valorcurse 提问时间:12/27/2017 最后编辑:undetected Seleniumvalorcurse 更新时间:3/2/2020 访问量:14835
使用 Chrome 时的 Selenium “selenium.common.exceptions.NoSuchElementException”
Selenium "selenium.common.exceptions.NoSuchElementException" when using Chrome
问:
我正在尝试在 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。
有什么解决方法可以解决这个问题吗?
答:
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 中的任何元素。
- 您采用的定位器策略无法识别该元素,因为它不在浏览器的视口中。
- 您采用的定位器策略可识别元素,但由于存在属性 style=“display: none;”,因此该元素不可见。
- 您采用的定位器策略不会唯一地标识 HTML DOM 中所需的元素,并且当前会找到其他一些隐藏/不可见的元素。
- 您尝试查找的 WebElement 位于标记中。
<iframe>
- WebDriver 实例甚至在 Web Element 在 HTML DOM 中存在/可见之前就一直在寻找 WebElement。
溶液
解决 NoSuchElementException 的解决方案可以是以下任一方法:
采用唯一标识所需 WebElement 的定位器策略。您可以借助开发人员工具(++ 或 )并使用元素检查器。CtrlShiftIF12
在这里,您将找到有关如何在 selenium3.6 中检查元素的详细讨论,因为 firebug 不再是 FF 56 的选项?
使用
execute_script()
方法将元素滚动到视图中,如下所示:elem = driver.find_element_by_xpath("element_xpath") driver.execute_script("arguments[0].scrollIntoView();", elem)
在这里,您将找到有关使用 Selenium 在 Python 中滚动到页面顶部的详细讨论
Incase 元素具有属性 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")
要检查元素是否在 HTML 中,请通过以下任一方法向上遍历以找到相应的标记和所需的 iframe:
<iframe>
<iframe>
switchTo()
driver.switch_to.frame("iframe_name") driver.switch_to.frame("iframe_id") driver.switch_to.frame(1) // 1 represents frame index
在这里,您可以找到关于如何选择html元素的详细讨论,无论它在selenium中的哪个框架中?
如果该元素立即在 HTML DOM 中不存在/不可见,请将 WebDriverWait expected_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 = WebDriverWait(driver, 20).until(expected_conditions.element_to_be_clickable((By.LINK_TEXT, "element_link_text")))
此用例
您之所以会看到,是因为 id 定位器无法唯一标识画布。要识别画布并在其上,您必须等待画布,并且要实现这一点,您可以使用以下代码块:NoSuchElementException
click()
clickable
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//canvas[@id='window1']"))).click()
参考
您可以在以下位置找到 Selenium 基于 java 客户端的相关讨论:
评论