souwasora
@souwasora (takei souwa)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Selenium Twitter(X)ログインしたい

解決したいこと

Classが見つからずloginフォームを見つける事ができない

Seleniumを用いて自動ログインを勉強中
ログイン画面までは行けるのですがログインフォームが見つからず処理が終わってしまう
解決方法を教えて下さい。

発生している問題・エラー

email_input = browser.find_elements_by_class_name('css-1dbjc4n r-18u37iz r-16y2uox r-1wbh5a2 r-1wzrnnt r-1udh08x r-xd6kpl r-1pn2ns4 r-ttdzmv')

スクリーンショット 2023-10-08 14.15.17.png

該当するソースコード

from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
from bs4 import BeautifulSoup
import requests

import time
import datetime

# 現在時刻を出力する関数
def now_time():
    dt_now = datetime.datetime.now()
    return dt_now.strftime('%m/%d %H:%M') + ' '

# WebDriverを初期化
browser = webdriver.Chrome(ChromeDriverManager().install())

# ウェブページにアクセス
url = 'https://twitter.com/i/flow/login'
browser.get(url)
print(now_time() + 'Twitterにアクセスしました')

time.sleep(10)

# 現在のページのHTMLを取得 後の為
res = requests.get(url)
soup = BeautifulSoup(res.text, 'html.parser',from_encoding='utf-8')

# BeautifulSoupで解析orSeleniumsで解析
# email_input = soup.find('div', attrs={'class': 'css-1dbjc4n'})
email_input = browser.find_elements_by_class_name('css-1dbjc4n r-18u37iz r-16y2uox r-1wbh5a2 r-1wzrnnt r-1udh08x r-xd6kpl r-1pn2ns4 r-ttdzmv')

# email_input = soup.find('input', {'autocomplete': 'username'})

if email_input:
    print("メールアドレス入力フィールドが見つかりました。")
else:
    print("メールアドレス入力フィールドが見つかりませんでした。")

自分で試したこと

検証ツールなどでclassを確認したのですが、実施する事ができず。。
ご教示お願いしたいです。

1

3Answer

以下の記事のようにfind_element_by_css_selectorを利用するように書き直して見るのはどうでしょうか

1Like

Comments

  1. @souwasora

    Questioner

    @cheer4uさん
    email_input = browser.find_element_by_css_selector('.css-1dbjc4n.r-16y2uox.r-1wbh5a2')
    で試してみましたが、同じくエラーが出てしまいました。
    ただ、アドバイスありがとうございます

  2. クラスは、自動生成されているみたいで自動生成ツールでビルドしたタイミングで変わるのかもしれません。私がみたときは、このページとは違うクラス名で構成されていました。
    browser.page_source で取得した html を確認してみるのはどうでしょうか

@cheer4uさんが記述いただいている方法でも解決できない場合、XPAHを利用して要素を取得してみてはどうでしょうか?

image.png

特にクラスの場合複数のオブジェクトが取れることもあり、特定のオブジェクトのみを取得するといった用途に用いるのは難しい気がします。

クラス指定で取得しないといけないという条件を必ず満たす必要がない限り、IDまたはXPATHでオブジェクトを取得したほうが良いかと思われます。

参考サイト ---
https://ito-room.com/selenium-xpath-practical/

質問に関係ない内容なので下記は読み飛ばして大丈夫です。
Twitterについて少し調べてみたのですが、ストレイピング対策をちょくちょくやっているようなので、定期的にコードのメンテナンスをする必要が出るかもしれません。

1Like

Comments

  1. @souwasora

    Questioner

    @Ryokhuさん
    browser.find_element_by_xpath('//div[@class="css-1dbjc4n r-16y2uox r-1wbh5a2"]')
    で試してみましたが
    エラーが同様にエラーが出てしまいました。
    ただ、アドバイスありがとうございます

「selenium.webdriver.common.by」ライブラリを使用し、一部のclassを指定することで、解決できるかもしれません。

from selenium.webdriver.common.by import By
from selenium import webdriver
from bs4 import BeautifulSoup
import requests

import time
import datetime

# 現在時刻を出力する関数
def now_time():
    dt_now = datetime.datetime.now()
    return dt_now.strftime('%m/%d %H:%M') + ' '

# WebDriverを初期化
browser = webdriver.Chrome()

url = 'https://twitter.com/i/flow/login'
browser.get(url)
print(now_time() + 'Twitterにアクセスしました')

time.sleep(10)

email_input = browser.find_element(By.CLASS_NAME,"css-1dbjc4n")

if email_input:
    print("メールアドレス入力フィールドが見つかりました。")
else:
    print("メールアドレス入力フィールドが見つかりませんでした。")
0Like

Comments

  1. @souwasora

    Questioner

    @jinbei230525さん
    改めてご教示ありがとうございます
    取得する事ができました。
    selenium.webdriver.common.by ライブラリは知見がないため理解を深めようかと思います。
    改めましてありがとうございました。

  2. @souwasora

    Questioner

    @jinbei230525さん
    現在↑で取得したclassに

    username = "自分のID"
    email_input.send_keys(username)
    

    を実施したのですが
    エラーElementNotInteractableException発生
    その要素が対話可能でない(ElementNotInteractableException)ことを示しています。つまり、その要素にはテキストを入力できない状態にある可能性
    となってしまいました。
    ですので、該当の箇所を指定する必要があるかと思い

    スクリーンショット 2023-10-15 15.16.19.png

    email_input = browser.find_elements(By.CLASS_NAME,"css-1dbjc4n")[44]
    

    を指定したのですが、ダメでした。

  3. 参考までにX(Twitter)へログインするプログラム書きましたので、お知らせします。

Your answer might help someone💌