我正在尝试在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。
任何解决方法可以使它正常工作?
selenium.common.exceptions.NoSuchElementException 通常称为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应包含以下参数:
selenium.common.exceptions
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 的原因可能是以下之一:
<iframe>
解决 NoSuchElementException 的解决方案可以是以下任一种:
Ctrl`` Shift``I``F12
在这里,您将找到有关如何检查selenium3.6中元素的详细讨论,因为FF56不再可以使用Firebug吗?
execute_script()
elem = driver.find_element_by_xpath("element_xpath") driver.execute_script("arguments[0].scrollIntoView();", elem)
在这里,您将找到有关使用Selenium在Python中滚动到页面顶部的详细讨论。
executeScript()
elem = driver.find_element_by_xpath("element_xpath") driver.execute_script("arguments[0].removeAttribute('style')", elem) elem.send_keys("text_to_send")
<iframe>``switchTo()
driver.switch_to.frame("iframe_name") driver.switch_to.frame("iframe_id") driver.switch_to.frame(1) // 1 represents frame index
在这里,您可以找到有关如何选择一个html元素(无论它处于硒中的哪个帧)的详细讨论?
如果该元素在 HTML DOM中 立即不 存在 /不 可见 ,则将WebDriverWait的预期条件设置为适当的方法,如下所示: __
等待 presentation_of_element_located :
element = WebDriverWait(driver, 20).until(expected_conditions.presence_of_element_located((By.XPATH, "element_xpath']")))
要等待 visible_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()上的画布,您必须等待 画布 成为 画布clickable并实现此目的,您可以使用以下代码块:
click()
clickable
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//canvas[@id='window1']"))).click()