2012-09-12 42 views
9

管理タスクを自動化しようとしていますが、これまで要素をクリックしてドロップダウンメニューを表示するようにセレンを作っています。それは私が要素が表示されなければならないというエラーを持っているものをメニュー要素のいずれかをクリックする時間が来るSelenium Webdriverのドロップダウン要素メニューをクリックしてください

enter image description here

コード:

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つの要素を選択しようとします。

+1

は、なぜあなたは 'menu'要素の参照の両側に眠っていますか?ページ要素を取得するときに要素が表示されない場合、webdriverはどれくらい待ってもそれをクリックできません。 –

+0

@ sr2222 driver.get()を呼び出すとページが取得され、doc.click()を実行するとドロップダウンが画面に表示され、domツリーに表示されます。ドロップダウンメニューがロードされない可能性が排除されました速くコードが実行されます。メニュー要素が存在し、少なくとも人間に見えるので、私はそれを保証することができます。 – loki

+0

クリックしてメニューが表示されるのを待ってから 'doc'をもう一度抜き出し、前後のオブジェクトの' id'属性を比較してみてください。私はセレンのサーバーが2番目の要素の抽出時にキャッシュされたwebelementオブジェクトを実際に参照しているという卑劣な疑いを持っています(クリックアクションはページロードイベントをトリガーしないため、ページオブジェクトは失効しません)。 –

答えて

8

あなたのクリックがあなたのリストを移入するAJAX呼び出しを発射されていない場合は、あなたが実際にクリックを実行する必要はありません。この

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 

のようなオプションを選択しない理由。

+0

@Nllesh Sharmaこのアプローチを使用しましたが、Web要素オブジェクトが反復可能ではないというエラーが表示されています。それが反復可能でない場合、forループでそれを反復する方法 – abhi

+0

@abhi find_elementSSSS_by_tag_name()を使用して確実ですか? (ちょうどあなたがそれを見たことを確かめるために) –

0

ターゲットのリンクを見つける必要があります。 実際には要素をクリックしたり、リンクをクリックしたりしないでください。つまり、リンクをクリックする最も確実な方法は、リンク要素を分離することです。

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()