再生しようとしています [〜#〜] 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に実際に切り替えることはできません。
これを機能させるための回避策はありますか?
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の理由は、次のいずれかになります。
<iframe>
_タグ内にあります。NoSuchElementExceptionに対処するための解決策は、次のいずれかになります。
目的のWebElementを一意に識別する ロケーター戦略 を採用します。Developer Tools((Ctrl+Shift+I または F12)そしてElement Inspectorを使用します。
ここでは、 FirebugはFF56のオプションではなくなったため、Selenium3.6の要素を検査する方法]に関する詳細な説明があります。
execute_script()
メソッドを使用して、次のように要素をスクロールして表示します。
_elem = driver.find_element_by_xpath("element_xpath")
driver.execute_script("arguments[0].scrollIntoView();", elem)
_
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要素を選択するにはどうすればよいですか? に関する詳細な説明を見つけることができます。
要素がHTML DOMでpresent/visibleでない場合は、 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")))
_
idロケーターがキャンバスを一意に識別しないため、NoSuchElementException
が表示されます。キャンバスとその上のclick()
を識別するには、キャンバスがclickable
になるのを待つ必要があります。これを実現するには、次のコードブロックを使用できます。
_WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//canvas[@id='window1']"))).click()
_