質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

1回答

2867閲覧

【selenium】time.sleep以外で待機処理する方法

katahik

総合スコア79

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2021/11/30 14:22

編集2021/11/30 23:07

実現したいこと

Python 3.8.8

閲覧いただきありがとうございます。
seleniumを用いて、web操作の自動化を試みていますが、time.sleep以外で待機処理することができず、困っています。
下記コードのように、WebDriverWaitを用いて待機処理を試みたのですが、下記エラーになり、できませんでした。

time.sleepを使った方法だと、処理自体はできたのですが、time.sleepを使うと処理結果が不安定になってしまうので、コンテンツを基準にした待機を実装したいところです。

皆様のお知恵をお貸しいただければ、幸いです。

該当箇所
# time.sleepを使っていたら処理ができたのですが、WebDriverWaitを使うと下記エラーが表示 WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located) # time.sleep(20)
code全文
# ライブラリをインポート 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 import datetime # ドライバーを指定 from selenium.webdriver.support.select import Select driver = webdriver.Chrome('./chromedriver') # 対象のWebサイトのURL URL = 'http://localhost/login' # 暗黙的な待機 driver.implicitly_wait(10) # 最大の読み込み時間を設定 今回は最大30秒待機できるようにする wait = WebDriverWait(driver=driver, timeout=30) try: EXEC_TIME = datetime.datetime.now() MAIL_ADDRESS = 'hogehoge@gmail.com' PASSWORD = 'Password' print('実行日時 ' + str(EXEC_TIME)) ## ログイン driver.get(URL) login_action = webdriver.common.action_chains.ActionChains(driver) # メールアドレス入力 email_box = driver.find_element_by_xpath('/html/body/div[1]/main/div/div[2]/form/div[1]/div/input') login_action.move_to_element_with_offset(email_box, 5, 5) login_action.click() login_action.send_keys(MAIL_ADDRESS) # パスワード入力 password_box = driver.find_element_by_xpath('//*[@id="input-password"]') login_action.move_to_element_with_offset(password_box, 5, 5) login_action.click() login_action.send_keys(PASSWORD) # ログインボタン押下 login_btn = driver.find_element_by_xpath('/html/body/div[1]/main/div/div[2]/form/div[3]/button') login_action.move_to_element_with_offset(login_btn, 5, 5) login_action.click() # 貯めていたキューを実行 login_action.perform() # 画面が表示されるまで待機 # wait.until(EC.presence_of_all_elements_located) WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located) # time.sleep(20) # サイドメニューを開くボタンを押下 side_menu_btn = driver.find_element_by_xpath('/html/body/div[1]/div[1]/label') if side_menu_btn.is_displayed(): print(side_menu_btn.is_displayed()) # => True side_menu_btn.click() else: print(side_menu_btn.is_displayed()) print("表示されてないのでクリックできない") print("正常終了します。") # エラーが発生した時はエラーメッセージを吐き出す。 except Exception as e: print(e) print("エラーが発生しました。")
error文
Message: element click intercepted: Element <label for="drawer-checkbox" class="drawer-btn">...</label> is not clickable at point (32, 104). Other element would receive the click: <div class="vld-background"></div> (Session info: chrome=96.0.4664.55)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/11/30 15:09

エラーメッセージとコードが対応していませんが、このエラーは、この後続でクリックした際に、待ちが足りなかったために発生したエラーだと確定していると言うことでしょうか?
katahik

2021/11/30 21:47 編集

@otn コメントありがとうございます。失礼しました、ご指摘の通り、後続のクリック時に、エラーが発生します。質問文を修正しました。
guest

回答1

0

表示されていないのでは?

Python

1if side_menu_btn.is_displayed(): 2 side_menu_btn.click() 3else: 4 print("表示されてないのでクリックできない")

そもそもですが、ボタンやAタグでなく、labelをクリックでいいのでしょうか?

投稿2021/11/30 22:21

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katahik

2021/11/30 22:44

@otn 回答ありがとうございます。提示していただいたif文を使ってみましたが、True(is_displayed() == True)の場合でも質問文のエラーが表示されました。ということは、表示(クリックできる状態にはなっている)はされているが、クリックできないということでしょうか?また、sleepを使えば、できていたのに、WebDriverWaitを使えばできなくなってしまうようなことはあるのでしょうか?
otn

2021/12/01 00:52 編集

> また、sleepを使えば、できていたのに、WebDriverWaitを使えばできなくなってしまうようなことはあるのでしょうか 目的タグが、サーバーから得たHTMLになくて、JavaScriptで追加したノードであれば、あり得ると思います。サーバーから得たHTMLが反映された時点で EC.presence_of_all_elements_located は終了すると思うので、その後のjavaScriptでのノード追加と微妙に前後した場合とか。 EC.element_to_be_clickable((By.XPATH, "~~") を条件に待ってみては? ただ、displayedが真なのにクリックできないと言うことはそれでも駄目かも。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問