web-dev-qa-db-ja.com

find_element_by_class_nameが機能しないボタンをクリックpython Selenium webdriver not working

PythonとSeleniumを使用して、LinkedInに連絡先を追加しようとしています。LinkedInによって作成された連絡先の提案を[ネットワーク]タブに追加しようとしています( https ://www.linkedin.com/mynetwork )、無限スクロール機能があります。

基本的に、スクリプトは、提案された各プロファイルの横にある「接続」ボタンを見つけ、ボタンをクリックし、エラーが発生するまで繰り返し、スクリプトが下にスクロールして「接続」ボタンをロードして繰り返します。

すべての接続ボタンには同じクラスがあるため、ボタン要素を見つけるための最良の方法はfind_element_by_class_name()を使用することです。また、CSSとXpathを使用して要素を特定しようとしましたが、成功しませんでした。

問題:スクリプトは最初の[接続]ボタンをクリックできますが、それ以降はクリックできません。実装について多くのアイデアを試しました(Xpath、CSS、クリックするボタンのリストを使用して検索)が、まだ機能していないようです。以下は、スクリプトの関連部分です。

while True:
    try:
        driver.find_element_by_class_name("mn-person-card__person-btn-ext.button-secondary-medium").click()
        time.sleep(1)
    except:
        pass
        print("trying to scroll")
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(1) 

何か案は?私には、コードが機能するはずであり、成功を妨げる他の何かがあるかのように思えます。たぶんバグかそれに類似したものです。私はこのすべてにかなり慣れていないことを言及するかもしれません。これは、ブラウザーを操作するために作成しようとしている最初のスクリプトです。

Firefoxドライバーを使用しています。完全なスクリプトはここにあります: http://Pastebin.com/qtdNsRtz

前もって感謝します!

6
thecpaptain

同じクラスを持つすべての要素を見つけるにはfind_elementsを使用する必要があります。これを試してすべての要素を取得します。

elements = driver.find_elements_by_class_name("mn-person-card__person-btn-ext.button-secondary-medium")

次に、forループを使用してそれらのそれぞれをクリックします。例えば:

for e in elements:
    e.click()
7
Amit

使用しようとしている方法find_element_by_class_nameロケーターは、内部の複合クラスをサポートしていないため、正しくありません。

クラス属性に複数のクラス名がある場合は、xpathまたはcssSelectorを使用する必要があります。

driver.find_element_by_xpath("//button[@class='mn-person-card__person-btn-ext button-secondary-medium']").click()
4
NarendraR