実現したいこと
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)