管理タスクを自動化しようとしていますが、これまでのところ、要素をクリックしてドロップダウンメニューを表示するようにセレンを作成しました。
これらのメニュー要素の 1 つをクリックするときが来たら、その要素を表示する必要があるというエラーが表示されます。
コード:
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
たが、どちらも機能しませんでした。
注: 表示されない要素は xpath 検索の要素です。dir(menu) でログに記録したため存在します。
編集:
menu
変数はメニュー自体ではなく、メニューの要素であるスパンの 1 つであり、ドロップダウンを表示するためにクリックさdoc
れるPerfil
html 要素です。
編集2:
クロム ツールで DOM を調べると、クリックするdoc
とツリーに新しいメニューが作成されます。それが ajax 呼び出しによるものなのか、Vanilla js によるものなのかはわかりません。作成方法はそれほど重要ではないと思います。ページから取得して、そこから python オブジェクトを作成することはできません。少なくともコードでは表示されていません。
最終編集:
私はそれを機能させるためにいくつかのJavaScriptを実行しました。どうやら、Seleniumがメニュー項目を見つけると、メニュードロップダウンをトリガーする最初の要素がフォーカスを失い、メニュー項目を選択せずにしばらく待つと、メニュードロップダウンがまだ表示されている場合、メニューが再び非表示になります。メニューから 1 つの要素を選択しようとすると、メニューが消えます。