私はpython Seleniumを初めて使用しますが、次のhtml構造を持つボタンをクリックしようとしています。
<div class="b_div">
<div class="button c_button s_button" onclick="submitForm('mTF')">
<input class="very_small" type="button"></input>
<div class="s_image"></div>
<span>
Search
</span>
</div>
<div class="button c_button s_button" onclick="submitForm('rMTF')" style="margin-bottom: 30px;">
<input class="v_small" type="button"></input>
<span>
Reset
</span>
</div>
</div>
上記のSearch
ボタンとReset
ボタンの両方(明らかに個別に)をクリックできるようにしたいと思います。
私はいくつかのことを試しました、例えば:
driver.find_element_by_css_selector('.button .c_button .s_button').click()
または、
driver.find_element_by_name('s_image').click()
または、
driver.find_element_by_class_name('s_image').click()
しかし、私は常にNoSuchElementException
で終わるようです、例えば:
Selenium.common.exceptions.NoSuchElementException: Message: u'Unable to locate element: {"method":"name","selector":"s_image"}' ;
HTMLのonclick属性を何らかの方法で使用してSeleniumをクリックできるかどうか疑問に思っていますか?
正しい方向に私を向けることができるすべての考えは素晴らしいでしょう。ありがとう。
CSSセレクターのクラス間のスペースを削除します。
driver.find_element_by_css_selector('.button .c_button .s_button').click()
# ^ ^
=>
driver.find_element_by_css_selector('.button.c_button.s_button').click()
Phantomjsをブラウザーとして使用しても同じ問題が発生したため、次の方法で解決しました。
driver.find_element_by_css_selector('div.button.c_button.s_button').click()
基本的に、DIVタグの名前を引用に追加しました。
次のデバッグプロセスは、同様の問題の解決に役立ちました。
with open("output_init.txt", "w") as text_file:
text_file.write(driver.page_source.encode('ascii','ignore'))
xpath1 = "the xpath of the link you want to click on"
destination_page_link = driver.find_element_by_xpath(xpath1)
destination_page_link.click()
with open("output_dest.txt", "w") as text_file:
text_file.write(driver.page_source.encode('ascii','ignore'))
次に、最初のページ( 'output_init.txt')とボタンをクリックして転送されたページ( 'output_dest.txt')を含む2つのテキストファイルが必要です。それらが同じであれば、コードは機能しませんでした。そうでない場合、コードは機能しましたが、別の問題があります。私にとっての問題は、コンテンツを変換してフックを作成するために必要なjavascriptがまだ実行されていないことのように思われました。
私が見るようにあなたのオプション:
xpath2 = "クリックするxpath"
WebDriverWait(driver、timeout = 5).until(lambda x:x.find_element_by_xpath(xpath2))
Xpathのアプローチは必ずしも優れているとは限りませんが、私はそれを好むだけです。セレクターアプローチも使用できます。