管理タスクを自動化しようとしていますが、これまで要素をクリックしてドロップダウンメニューを表示するようにセレンを作っています。それは私が要素が表示されなければならないというエラーを持っているものをメニュー要素のいずれかをクリックする時間が来るSelenium Webdriverのドロップダウン要素メニューをクリックしてください
。
コード:
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get(url)
doc = driver.find_element_by_css_selector('td.ms-vb-title > table')
try:
doc.click()
time.sleep(4)
menu = driver.find_element_by_xpath('//menu/span[5]')
time.sleep(4)
print dir(menu)
menu.click()
except:
traceback.print_exc()
driver.quit()
エラー:
Traceback (most recent call last):
File "aprobar_docs.py", line 22, in main
menu.click()
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py",
line 52, in click
self._execute(Command.CLICK_ELEMENT)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py",
line 205, in _execute
return self._parent.execute(command, params)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", l
ine 156, in execute
self.error_handler.check_response(response)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py"
, line 147, in check_response
raise exception_class(message, screen, stacktrace)
ElementNotVisibleException: Message: u'Element must be displayed to click'
コードは多くのことを待って、あなたが見ることができるように要素がロードされて取得します。また、要素のis_displayed
プロパティをTrue
に設定しようとしましたが、どちらも機能しませんでした。
注:表示されていない要素が、私はDIR(メニュー)と、それを記録してきたので、それが存在している、XPathの検索の一つです
編集:
menu
変数ではありませんメニューそのものは、メニューの要素であるスパンの1つで、doc
は、Perfil
html要素がクリックされてドロップダウンを表示します。
編集2:クロームツールのDOMを検査
、あなたがdoc
新しいメニューがツリー上に作成します]をクリックしたとき、それが原因でAJAX呼び出しやバニラのJSのだならば、私は知りません、私はそれが本当にいかに重要であるとは思わない。私はページからそれを取得し、それからPythonオブジェクトを作ることはできません。少なくともコードには表示されていません。
最終編集:
私はそれを動作させるためにいくつかのJavaScriptを実行することになりました。明らかにSeleniumがメニュー項目を見つけたときに、メニュードロップダウンを引き起こす最初の要素がフォーカスを失い、メニュー項目を選択せずにメニュードロップダウンがまだ表示されていれば、メニューが消えるメニューから1つの要素を選択しようとします。
は、なぜあなたは 'menu'要素の参照の両側に眠っていますか?ページ要素を取得するときに要素が表示されない場合、webdriverはどれくらい待ってもそれをクリックできません。 –
@ sr2222 driver.get()を呼び出すとページが取得され、doc.click()を実行するとドロップダウンが画面に表示され、domツリーに表示されます。ドロップダウンメニューがロードされない可能性が排除されました速くコードが実行されます。メニュー要素が存在し、少なくとも人間に見えるので、私はそれを保証することができます。 – loki
クリックしてメニューが表示されるのを待ってから 'doc'をもう一度抜き出し、前後のオブジェクトの' id'属性を比較してみてください。私はセレンのサーバーが2番目の要素の抽出時にキャッシュされたwebelementオブジェクトを実際に参照しているという卑劣な疑いを持っています(クリックアクションはページロードイベントをトリガーしないため、ページオブジェクトは失効しません)。 –