Selenium “selenium.common.exceptions.NoSuchElementException” when using Chrome
我正在尝试在Chrome上使用Selenium玩QWOP,但我一直收到以下错误:
1 2 3 4 5 6 | 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) |
使用以下代码时:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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。
有什么解决办法来解决这个问题吗?
这是一个
1 | exception selenium.common.exceptions.NoSuchElementException(msg=None, screen=None, stacktrace=None) |
在2例
-
当使用:
1
2webdriver.find_element_by_*("expression")
//example : my_element = driver.find_element_by_xpath("xpath_expression") -
当使用:
1
2element.find_element_by_*("expression")
//example : my_element = element.find_element_by_*("expression")
在每个API文档就像任何其他
-
味精、屏程序
1
2
3
4raise 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)
的原因
原因之一是大学时抛出,可以以下:
- 该定位策略来确定你是不是在任何HTML DOM元素。
- 该策略通过定位器,你无法确定它不在元件浏览器的视窗。
- 你有明确的定位策略所采用的是一元,但由于存在无形的属性样式="不显示"。
- 你必须采取的战略定位非常明确的目的不是在HTML DOM元素的发现在其他一些隐藏的和无形的元/。
- 你想webelement的定位是在一
标签。 - 该示例是一webdriver看出来的是,在目前的webelement元/ visibile在HTML DOM。
解决方案
该解决方案可以解决时抛出的任何如下:
-
一个独特的定位策略,以确定所需的webelement。你可以把服务的开发工具(ctrl + +或f12 shift i元)和使用的检查。
在这里你会发现的详细讨论如何inspect元中的一selenium3.6 Firebug选项是没有任何更多的是56法郎吗?
-
使用方法:
execute_script() 滚动到视图中的元素如下:1
2elem = driver.find_element_by_xpath("element_xpath")
driver.execute_script("arguments[0].scrollIntoView();", elem)在这里你会发现的详细讨论滚动到页面顶端使用Python中的硒
-
该属性是一incase元的HAVING风格="显示:无;"删除的属性,通过
executeScript() 方法如下:1
2
3elem = driver.find_element_by_xpath("element_xpath")
driver.execute_script("arguments[0].removeAttribute('style')", elem)
elem.send_keys("text_to_send") -
CT检查是一种
如果元在导线上的HTML标签的估计和所需的各 switchTo() iframe的或以下的方法:通过大学1
2
3driver.switch_to.frame("iframe_name")
driver.switch_to.frame("iframe_id")
driver.switch_to.frame(1) // 1 represents frame index在这里你可以找到详细的讨论我怎么选择框中的HTML元素,它是在物硒?。。。。。。。
-
如果元素是不可见的在HTML DOM提出立即与预期的条件下,氧webdriverwait _集到适当的方法如下:
-
它的存在对_等_位于_元):
1element = WebDriverWait(driver, 20).until(expected_conditions.presence_of_element_located((By.XPATH,"element_xpath']"))) -
在对_)等知名公司:_ _元
1element = WebDriverWait(driver, 20).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR,"element_css") -
等待是对_元到_是_点击:
1element = WebDriverWait(driver, 20).until(expected_conditions.element_to_be_clickable((By.LINK_TEXT,"element_link_text")))
-
这个用例
因为你看到
1 | WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH,"//canvas[@id='window1']"))).click() |