web-dev-qa-db-ja.com

Chrome)を使用する場合のSelenium "Selenium.common.exceptions.NoSuchElementException"

再生しようとしています [〜#〜] qwop [〜#〜] SeleniumをChromeで使用していますが、次のエラーが発生し続けます:

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に実際に切り替えることはできません。

これを機能させるための回避策はありますか?

8
valorcurse

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")
    _

他の_Selenium.common.exceptions_と同様に、APIドキュメントに従って、NoSuchElementExceptionには次のパラメータが含まれている必要があります。

  • msg、screen、stacktrace

    _    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の理由は、次のいずれかになります。

  • 採用したLocator Strategyは、 HTML DOM の要素を識別しません。
  • 採用したLocator Strategyは、ブラウザの Viewport 内にないため、要素を識別できません。
  • 採用したLocator Strategyは要素を識別しますが、属性style = "display:none;"が存在するため表示されません。
  • 採用したLocator Strategy一意にHTML DOM内の目的の要素を識別せず、現在、他のhiddenを検出します/invisible要素。
  • 見つけようとしているWebElementは、_<iframe>_タグ内にあります。
  • WebDriverインスタンスは、要素がHTML DOM内に存在/表示される前であっても、WebElementを探しています。

解決

NoSuchElementExceptionに対処するための解決策は、次のいずれかになります。


このユースケース

idロケーターがキャンバスを一意に識別しないため、NoSuchElementExceptionが表示されます。キャンバスとその上のclick()を識別するには、キャンバスclickableになるのを待つ必要があります。これを実現するには、次のコードブロックを使用できます。

_WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//canvas[@id='window1']"))).click()
_

参照

Selenium 's Java クライアントベースの関連するディスカッションは次の場所にあります。

8
DebanjanB