以下の記事のようにfind_element_by_css_selector
を利用するように書き直して見るのはどうでしょうか
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')
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を確認したのですが、実施する事ができず。。
ご教示お願いしたいです。
以下の記事のようにfind_element_by_css_selector
を利用するように書き直して見るのはどうでしょうか
@souwasora
Questioner@cheer4uさん
email_input = browser.find_element_by_css_selector('.css-1dbjc4n.r-16y2uox.r-1wbh5a2')
で試してみましたが、同じくエラーが出てしまいました。
ただ、アドバイスありがとうございます
クラスは、自動生成されているみたいで自動生成ツールでビルドしたタイミングで変わるのかもしれません。私がみたときは、このページとは違うクラス名で構成されていました。
browser.page_source で取得した html を確認してみるのはどうでしょうか
@cheer4uさんが記述いただいている方法でも解決できない場合、XPAHを利用して要素を取得してみてはどうでしょうか?
特にクラスの場合複数のオブジェクトが取れることもあり、特定のオブジェクトのみを取得するといった用途に用いるのは難しい気がします。
クラス指定で取得しないといけないという条件を必ず満たす必要がない限り、IDまたはXPATHでオブジェクトを取得したほうが良いかと思われます。
参考サイト ---
https://ito-room.com/selenium-xpath-practical/
質問に関係ない内容なので下記は読み飛ばして大丈夫です。
Twitterについて少し調べてみたのですが、ストレイピング対策をちょくちょくやっているようなので、定期的にコードのメンテナンスをする必要が出るかもしれません。
@souwasora
Questioner「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("メールアドレス入力フィールドが見つかりませんでした。")
@souwasora
Questioner@jinbei230525さん
改めてご教示ありがとうございます
取得する事ができました。
selenium.webdriver.common.by ライブラリは知見がないため理解を深めようかと思います。
改めましてありがとうございました。
@souwasora X(Twitter)にログインできました???
@souwasora
Questioner@jinbei230525さん
現在↑で取得したclassに
username = "自分のID"
email_input.send_keys(username)
を実施したのですが
エラーElementNotInteractableException発生
その要素が対話可能でない(ElementNotInteractableException)ことを示しています。つまり、その要素にはテキストを入力できない状態にある可能性
となってしまいました。
ですので、該当の箇所を指定する必要があるかと思い
email_input = browser.find_elements(By.CLASS_NAME,"css-1dbjc4n")[44]
を指定したのですが、ダメでした。
参考までにX(Twitter)へログインするプログラム書きましたので、お知らせします。