11

管理タスクを自動化しようとしていますが、これまでのところ、要素をクリックしてドロップダウンメニューを表示するようにセレンを作成しました。

ここに画像の説明を入力

これらのメニュー要素の 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れるPerfilhtml 要素です。

編集2:

クロム ツールで DOM を調べると、クリックするdocとツリーに新しいメニューが作成されます。それが ajax 呼び出しによるものなのか、Vanilla js によるものなのかはわかりません。作成方法はそれほど重要ではないと思います。ページから取得して、そこから python オブジェクトを作成することはできません。少なくともコードでは表示されていません。

最終編集:

私はそれを機能させるためにいくつかのJavaScriptを実行しました。どうやら、Seleniumがメニュー項目を見つけると、メニュードロップダウンをトリガーする最初の要素がフォーカスを失い、メニュー項目を選択せず​​にしばらく待つと、メニュードロップダウンがまだ表示されている場合、メニューが再び非表示になります。メニューから 1 つの要素を選択しようとすると、メニューが消えます。

4

2 に答える 2

8

このようなオプションを選択してみませんか

el = driver.find_element_by_id('id_of_select')
for option in el.find_elements_by_tag_name('option'):
    if option.text == 'The Options I Am Looking For':
        option.click() # select() in earlier versions of webdriver

クリックでリストに入力するための ajax 呼び出しが発生しない場合は、実際にクリックを実行する必要はありません。

于 2012-09-12T20:12:42.787 に答える
1

ターゲットのリンクを見つける必要があります。要素をクリックするのではなく、リンクをクリックします... (というか、リンクが含まれる要素をクリックします)。そうは言っても、リンクをクリックする最も確実な方法は、リンク要素を分離することです。

frame = driver.find_element_by_id('this_is_your_frame_name') 
links = frame.find_elements_by_xpath('.//a')
links[1].click()

または代わりに、

for link in links:
    if link.text() == "Administratar Permisos":
        link.click()
于 2012-09-12T23:50:32.320 に答える