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

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

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

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

selenium

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

Q&A

1回答

1174閲覧

selenium headlessモード時のエラー

karage

総合スコア4

Python

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

selenium

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

0グッド

0クリップ

投稿2023/03/26 04:17

編集2023/03/26 04:19

実現したいこと

headlessモードでのエラーを解消したい。

前提

seleniumでブラウザを起動させ、特定の文字列を取得し、それをLineで通知させるシステムを作っています。
通常のブラウザを自動起動させるやり方では問題ないのですが、headlessモードだとエラーが発生してしまいます。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "/***/get_weekday.py", line 95, in <module> a.click() File "/Users/****/.pyenv/versions/3.9.2/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 81, in click self._execute(Command.CLICK_ELEMENT) File "/Users/****/.pyenv/versions/3.9.2/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 740, in _execute return self._parent.execute(command, params) File "/Users/****/.pyenv/versions/3.9.2/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py", line 430, in execute self.error_handler.check_response(response) File "/Users/****/.pyenv/versions/3.9.2/lib/python3.9/site-packages/selenium/webdriver/remote/errorhandler.py", line 247, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <a onclick="return false;" id="dlRepeat_ctl00_tpItem_dgTable_ctl04_b20230407" tabindex="1" onmousedown="mouseDown(event); return false;" onmouseup="mouseUp(event);" onkeypress="keyPress(event);" href="javascript:__doPostBack('dlRepeat$ctl00$tpItem$dgTable$ctl04$b20230407','')" onfocus="lbF(this)" onblur="lbB(this)" style="font-size:14pt;font-weight:bold;">...</a> is not clickable at point (781, 590). Other element would receive the click: <html>...</html>

該当のソースコード

python

1# -*- coding: utf-8 -*- 2from selenium import webdriver 3from selenium.webdriver.common.by import By 4from time import sleep 5from selenium.webdriver.chrome.options import Options 6import datetime 7import data 8import requests 9 10 11# headlessモード 12options = Options() 13options.add_argument("--headless") 14browser = webdriver.Chrome(options = options) 15 16 17# ブラウザモード 18# browser = webdriver.Chrome() 19 20 21browser.get(data.INFO["URL"]) # ブラウザ開く 22 23sleep(3) 24 25######################################## 26## ログイン ## 27######################################## 28 29elem_login_link = browser.find_element(By.NAME, "rbtnLogin").click() # ログイン画面へ遷移 30 31sleep(3) 32 33elem_username = browser.find_element(By.ID, "txtID").send_keys(data.INFO["ID"]) 34 35elem_userpassword = browser.find_element(By.ID, "txtPass").send_keys(data.INFO["PASS"]) 36 37elem_login_btn = browser.find_element(By.ID, "ucPCFooter_btnForward").click() 38 39sleep(3) 40 41elem_select_menu = browser.find_element(By.ID, "dlSSCategory_ctl02_btnSSCategory").click() 42 43sleep(3) 44 45elem_select_place = browser.find_element(By.ID, "dgShisetsuList_ctl02_chkSelectLeft").click() 46 47sleep(3) 48 49elem_select_btnForward = browser.find_element(By.ID, "ucPCFooter_btnForward").click() 50 51sleep(3) 52 53elem_select_period = browser.find_element(By.ID, "rbtnTwoWeek").click() 54elem_select_time_frame = browser.find_element(By.ID, "rbtnNight").click() 55 56 57elem_select_tue = browser.find_element(By.ID, "chkTue").click() 58elem_select_wed = browser.find_element(By.ID, "chkWed").click() 59elem_select_thu = browser.find_element(By.ID, "chkThu").click() 60elem_select_fri = browser.find_element(By.ID, "chkFri").click() 61 62sleep(3) 63 64elem_select_btnForward = browser.find_element(By.ID, "ucPCFooter_btnForward").click() 65 66sleep(3) 67 68 69elem_select_table = browser.find_element(By.ID, "dlRepeat_ctl00_tpItem_dgTable") 70browser.execute_script('arguments[0].click();', elem_select_table) 71 72# a要素のテキストを取得 73count = 0 74for a in elem_select_table.find_elements(By.TAG_NAME, 'a'): 75 if count >= 10: 76 break 77 78 if "○" in a.text: 79 a.click() 80 count += 1 81 82 if count >= 10: 83 break 84 if "△" in a.text: 85 a.click() 86 count += 1 87 88sleep(3) 89 90elem_select_btnForward = browser.find_element(By.ID, "ucPCFooter_btnForward").click() 91 92sleep(3) 93 94tables = browser.find_elements(By.CSS_SELECTOR, 'table[id$="_tpItem_dgTable"]') 95 96 97output_text = "" 98 99for table in tables: 100 rows = table.find_elements(By.TAG_NAME, 'tr') 101 first_row = rows[0] 102 second_row = rows[1] 103 first_tds = first_row.find_elements(By.TAG_NAME, 'td') 104 second_tds = second_row.find_elements(By.TAG_NAME, 'td') 105 106 107 available_last_time = second_tds[3].text 108 109 if "○" in available_last_time: 110 output_text += '\n' + first_tds[0].text.replace('\n', '') 111 output_text += second_tds[0].text.replace('\n', '') + '\n' 112 output_text += first_td:s[3].text.replace('\n', '') + '\n' 113 output_text += '\n' + "****" #リンク 114 115 116print(output_text) 117 118 119# LINE Notify APIのURLとアクセストークンを設定する 120LINE_URL = "https://notify-api.line.me/api/notify" 121ACCESS_TOKEN = "****" 122 123# 通知するメッセージを設定する 124message = output_text 125 126# # LINE Notify APIを使用してメッセージを送信する 127headers = {"Authorization": "Bearer " + ACCESS_TOKEN} 128payload = {"message": message} 129response = requests.post(LINE_URL, headers=headers, data=payload)

試したこと

エラー内容でググったところ、原因は「ElementClickInterceptedExceptionで要素をクリックできないことが起因」となっている認識です。
なので、79, 85行目のa.click()を以下のように書き換えてみましたが、

browser.execute_script('arguments[0].click();', a)

対象の要素をクリックすることができないエラーが表示されました...

補足情報(FW/ツールのバージョンなど)

Python 3.9.2

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

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

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

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

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

guest

回答1

0

ブラウザ画面サイズによって、要素の配置を変えるページはごく普通です。画面非表示の際に、目的要素の手前に別の要素が配置されたのでしょう。
対策としては、クリックした際に何が起こるかを調べて、それと同じ事をexecute_script等で実行するとかでしょうか。
他には、やったことは無いですが、
・上にかぶっている要を調べて削除する
・クリックしたい要素のz-indexを変更する
などでも、出来るかも知れません。いずれもJavaScriptでやることになると思います。

投稿2023/03/26 08:56

otn

総合スコア84498

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問