查看: 2060|回复: 1

selenium.common.exceptions.NoSuchElementException: Message: no such element:...

[复制链接]

22

主题

107

帖子

266

积分

中级会员

Rank: 3Rank: 3

积分
266
发表于 2018-9-19 15:03:07 | 显示全部楼层 |阅读模式
我正在尝试在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)
使用以下代码时:
  1. from selenium import webdriver
  2. from selenium.webdriver.common.action_chains import ActionChains
  3. import time

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

  8. canvas = browser.find_element_by_id("window1")

  9. canvas.click()

  10. while (True):
  11.     action = ActionChains(browser)
  12.     action.move_to_element(canvas).perform()
  13.     canvas.click()
  14.     canvas.send_keys("q")
复制代码

相同的代码在Firefox上完美运行,但由于我想使用chrome的功能在无头模式下运行webgl游戏,我不能切换到Firefox。
有什么办法让这个正常工作吗?
回复

使用道具 举报

3

主题

31

帖子

83

积分

注册会员

Rank: 2

积分
83
发表于 2018-9-19 15:07:36 | 显示全部楼层
本帖最后由 他改变了中国 于 2018-9-19 15:08 编辑

NoSuchElementException
selenium.common.exceptions.NoSuchElementException俗称NoSuchElementException为:
exception selenium.common.exceptions.NoSuchElementException(msg=None, screen=None, stacktrace=None)
NoSuchElementException 基本上抛出2种情况如下:
  1. <font size="4">•        webdriver.find_element_by_*("expression")
  2. //example : my_element = driver.find_element_by_xpath("xpath_expression")</font>
复制代码
  1. <font size="4">•        element.find_element_by_*("expression")
  2. //example : my_element = element.find_element_by_*("expression")</font>
复制代码

根据API文档, selenium.common.exceptions,NoSuchElementException应包含以下参数:
  1. <font size="4">•        消息,屏幕,堆栈跟踪
  2. •            raise exception_class(message, screen, stacktrace)
  3. •        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]"}
  4. •          (Session info: chrome=61.0.3163.100)
  5.   (Driver info: chromedriver=2.32.498550 (9dec58e66c31bcc53a9ce3c7226f0c1c5810906a),platform=Windows NT 10.0.10240 x86_64)</font>
复制代码

原因
NoSuchElementException的原因可能是以下之一:
•        您采用的定位器策略未标识HTML DOM中的任何元素。•        您采用的定位器策略无法识别元素,因为它不在浏览器的视口中。
•        您采用的定位器策略标识元素,但由于属性style =“display:none;”的存在而不可见。。
•        您采用的定位器策略不能唯一标识HTML DOM中的所需元素,并且当前会找到其他隐藏 / 不可见元素。
•        您尝试查找的WebElement位于<iframe>标记内。
•        该webdriver的实例看着外面的WebElement甚至之前的元素都看得到内本/ HTML DOM。

解决NoSuchElementException的解决方案可以是以下任一种:
•        采用定位策略,唯一标识所需的WebElement。您可以获取开发人员工具(Ctrl+ Shift+ I或F12)的帮助并使用Element Inspector。
•        使用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")
•        要检查元素是否在<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
•        如果该元素在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_to_be_clickable:
element = WebDriverWait(driver, 20).until(expected_conditions.element_to_be_clickable((By.LINK_TEXT, "element_link_text")))
________________________________________
用例
您看到了NoSuchElementException因为id定位器没有唯一标识画布。为了确定画布并在其上click(),你可以使用下面的代码块:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//canvas[@id='window1']"))).click()

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表