web-dev-qa-db-ja.com

python Seleniumボタンをクリック

私は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をクリックできるかどうか疑問に思っていますか?

正しい方向に私を向けることができるすべての考えは素晴らしいでしょう。ありがとう。

57
AJW

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

これを試して:

firefoxをダウンロードし、プラグイン「firebug」と「firepath」を追加します。それらをインストールした後、Webページに移動し、firebugを起動して要素のxpathを見つけます。これはページ内で一意なので、間違いを犯すことはできません。

画像を参照してください: instruction

browser.find_element_by_xpath( 'Xpathをコピーして貼り付ける').click()

22
Carlo 1585

Phantomjsをブラウザーとして使用しても同じ問題が発生したため、次の方法で解決しました。

driver.find_element_by_css_selector('div.button.c_button.s_button').click()

基本的に、DIVタグの名前を引用に追加しました。

2
CosimoCD

次のデバッグプロセスは、同様の問題の解決に役立ちました。

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がまだ実行されていないことのように思われました。

私が見るようにあなたのオプション:

  1. ドライバーにjavascriptを実行させてから、find要素のコードを呼び出します。このアプローチには従わなかったため、stackoverflowでこれに関する詳細な回答を探してください。
  2. 'output_dest.txt'で、同じ結果を生成する同等のフックを見つけるだけです。これが私がやったことです。
  3. 何かをクリックする前に少し待ってみてください。

xpath2 = "クリックするxpath"

WebDriverWait(driver、timeout = 5).until(lambda x:x.find_element_by_xpath(xpath2))

Xpathのアプローチは必ずしも優れているとは限りませんが、私はそれを好むだけです。セレクターアプローチも使用できます。

2
Tanel