我正在尝试玩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
基本上在2种情况下抛出如下: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 的原因可能是以下之一:
<iframe>
中标签。 解决方案
解决 NoSuchElementException 的解决方案可以是以下之一:
在这里您可以找到关于 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 的详细讨论。
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? 的详细讨论。 .
element = WebDriverWait(driver, 20).until(expected_conditions.presence_of_element_located((By.XPATH, "element_xpath']")))
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")))
这个用例
您正在查看
NoSuchElementException
因为 id 定位器不能识别 Canvas 独一无二。识别 Canvas 和click()
在它上面你必须等待 Canvas 成为 clickable
为了实现这一点,您可以使用以下代码块:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//canvas[@id='window1']"))).click()
引用
您可以找到Selenium的java基于客户的相关讨论:
关于python - 使用 Chrome 时 Selenium "selenium.common.exceptions.NoSuchElementException",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63262440/