PythonSeleniumボタンをクリックします


88

私はPythonセレンにまったく慣れておらず、次の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>

上のボタンSearchResetボタンの両方をクリックできるようにしたいと思います(明らかに個別に)。

私はいくつかのことを試しました、例えば:

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属性を使用してセレンクリックを作成できるかどうか疑問に思っていますか?

私を正しい方向に向けることができるどんな考えも素晴らしいでしょう。ありがとう。

回答:


17

Pythonの場合は、

from selenium.webdriver import ActionChains

そして

ActionChains(browser).click(element).perform()

elementですか?
rosefun

106

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

1
私はあなたが提案したことを試しました。同じNoSuchElementExceptionエラーが発生します!
AJW 2014年

2
@ AJW、Try print(driver.page_source)、およびhtmlに実際に要素が含まれていることを確認してください。
falsetru 2014年

ありがとう。やったprint(driver.page_source)ところ、名前が違うことがわかりました。奇妙な。スペースを取り除いて名前を変更すると、今すぐクリックします。フォローアップでは:リセットボタンと検索ボタンも同じclassです:この場合、クリック中に検索ボタンとリセットボタンをどのように区別しますか?
AJW 2014年

1
@ AJW、xpathの使用方法:driver.find_element_by_xpath('.//div[@class="button c_button s_button"][contains(., "Search")]')
falsetru 2014年

1
@ MortezaLSC、GUIがないシステムで可能であるということであれば、それは可能です。ヘッドレスブラウザを使用してください。たとえば、PhantomJS。
falsetru 2014年

31

これを試して:

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

写真を参照してください: 命令

browser.find_element_by_xpath('just copy and paste the Xpath').click()


5
このような素晴らしいライフハックをありがとうございました。それは多くの時間を節約しました
ヒーローガイ

これはMacBCでは機能しませんか?FirebugとFire Pathの両方がアドオンとして表示されません
Bob

OSの問題ではなく、Firefoxのバージョンである場合もありますが、Firefoxの最後のバージョンではFirePathに問題があります。私は、Firefox 55.0.3
Carlo 1585

2
Firefoxで要素を見つけるには、[ツール]-> [Web開発者]-> [インスペクター]を使用します。GUIのボタンをクリックし、インスペクター部分で、関連するコードをマウスで右クリックします->コピーして選択します:CSSセレクター/ CSSパス/ Xpath ...
Nir

4

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

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

基本的に、DIVタグの名前を見積もりに追加しました。


3

ウェブサイトhttps://adviserinfo.sec.gov/compilationを開き、ボタンをクリックしてファイルをダウンロードします。PythonSeleniumを使用している場合は、ポップアップを閉じたい場合もあります。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.webdriver.chrome.options import Options 

#For Mac - If you use windows change the chromedriver location
chrome_path = '/usr/local/bin/chromedriver'
driver = webdriver.Chrome(chrome_path)

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--disable-popup-blocking")

driver.maximize_window()
driver.get("https://adviserinfo.sec.gov/compilation")

# driver.get("https://adviserinfo.sec.gov/")
# tabName = driver.find_element_by_link_text("Investment Adviser Data")
# tabName.click()

time.sleep(3)

# report1 = driver.find_element_by_xpath("//div[@class='compilation-container ng-scope layout-column flex']//div[1]//div[1]//div[1]//div[2]//button[1]")

report1 = driver.find_element_by_xpath("//button[@analytics-label='IAPD - SEC Investment Adviser Report (GZIP)']")

# print(report1)
report1.click()

time.sleep(5)

driver.close()

2

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

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アプローチが必ずしも優れているとは限りません。私はそれを好みます。セレクター・アプローチを使用することもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.