Python Seleniumでエラーが出る
受付中
回答 3
投稿
- 評価
- クリップ 0
- VIEW 435
YouTubeのコメントを一括削除するコードを書いているのですが、ループの部分で
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
というエラーが出ました。押下する要素をボタンの親にするなど対策してみたものの効果がありません。解決策が分かる方は教えていただきたいです。
ソースコード
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
import chromedriver_binary
import time
from selenium.common.exceptions import NoSuchElementException
wait_time = 30
# 画面遷移関数
url = "https://www.youtube.com/feed/history/comment_history"
def page_move(url):
WebDriverWait(driver, wait_time).until(
EC.presence_of_element_located((By.XPATH, url))
)
def insert_pw(xpath, str):
driver.find_element_by_xpath(xpath).send_keys(str)
def click(xpath):
driver.find_element_by_xpath(xpath).click()
# YouTubeコメントページに移動
driver = webdriver.Chrome()
driver.implicitly_wait(1)
driver.get(url)
# YouTubeログインページに移動
login_button = '/html/body/ytd-app/div/div/ytd-masthead/div[3]/div[3]/div[2]/ytd-button-renderer/a/paper-button'
click(login_button)
time.sleep(1)
# Googleログイン
# ID入力
login_id = "hogehogehogehoge@gmail.com"
login_id_xpath = '/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[1]/div/form/span/section/div/div/div[1]/div/div[1]/div/div[1]/input'
login_id_button = '/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[2]/div/div[1]/div/div'
insert_pw(login_id_xpath, login_id)
click(login_id_button)
time.sleep(1)
# パスワード入力
login_pw = "hoge1234"
login_pw_xpath = '/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[1]/div/form/span/section/div/div/div[1]/div[1]/div/div/div/div/div[1]/div/div[1]/input'
login_pw_button = '/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[2]/div/div[1]/div/div'
insert_pw(login_pw_xpath, login_pw)
time.sleep(1)
click(login_pw_button)
time.sleep(3)
comment_div = '/html/body/ytd-app/div/ytd-page-manager/ytd-browse/ytd-two-column-browse-results-renderer/div[1]/ytd-section-list-renderer/div[2]/ytd-item-section-renderer/div[3]'
num_of_comments = driver.find_element_by_xpath(comment_div)
print(num_of_comments)
for num in range(100):
menu_bar = '/html/body/ytd-app/div/ytd-page-manager/ytd-browse/ytd-two-column-browse-results-renderer/div[1]/ytd-section-list-renderer/div[2]/ytd-item-section-renderer/div[3]/ytd-comment-history-entry-renderer[1]/div[2]/ytd-menu-renderer'
time.sleep(1)
click(menu_bar)
time.sleep(1)
delete_button = '/html/body/ytd-app/ytd-popup-container/iron-dropdown/div/ytd-menu-popup-renderer/paper-listbox/ytd-menu-navigation-item-renderer[2]'
delete_button_alt = '/html/body/ytd-app/ytd-popup-container/iron-dropdown/div/ytd-menu-popup-renderer/paper-listbox/ytd-menu-navigation-item-renderer'
try:
driver.find_element_by_xpath(delete_button)
except NoSuchElementException:
delete_button = delete_button_alt
click(delete_button)
delete_confirm = '/html/body/ytd-app/ytd-popup-container/paper-dialog/yt-confirm-dialog-renderer/div[2]/div/yt-button-renderer[2]/a/paper-button'
delete_button_alt = '/html/body/ytd-app/ytd-popup-container/paper-dialog/yt-confirm-dialog-renderer/div[2]/div/yt-button-renderer[2]/a/paper-button'
click(delete_confirm)
time.sleep(1)
driver.close()
driver.quit()
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
どのクリックでのエラーかわかりませんが、その箇所でdriver.find_element_by_xpath(xpath)
で得られた要素が本当に目的のノードかを確認するのでしょうか。
XPathが「何番目のdiv」とかの指定なので、非常に危うい感じです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
短絡的かつ強引な手段ですが以下に変更してみるのはどうでしょう。
def click(xpath):
driver.execute_script('document.evaluate(' + xpath + ', document, null, 7, null).snapshotItem(0).click();')
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
XPathは絶対XPathのほうがいいと思います。
xpathの書き方なら、下記の記事をご参照ください。
お役に立てれば幸いです。
XPathとは?基本概念や書き方をわかりやすく解説!
またYouTubeのコメントをスクレイピングしたいなら、Octoparseはそのようなテンプレートを提供しています。
https://service.octoparse.com/ja-jp/web-scraping-template
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.31%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる