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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Google Cloud Platform

Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

Python

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

selenium

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

受付中

selenium のエラー no such element: Unable to locate element: 解決できない

kanafuku
fkan

総合スコア10

Google Cloud Platform

Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

Python

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

selenium

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

1回答

0評価

0クリップ

93閲覧

投稿2022/09/23 08:47

編集2022/09/26 16:52

前提

BASEのログイン画面をseleniumでスクレイピングしているコードが
ローカルでは問題なく実行できるのですが、
該当のコードをHTTPトリガーでGCPにデプロイして、
トリガーURLをPOSTリクエストするとタイトルのエラーになります。
(デプロイ自体は問題なくできます。)

実現したいこと

  • 本番環境で実行させたい

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

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"id","selector":"UserMailAddress"}

該当のソースコード

python

import os import shutil import stat import tempfile import time import urllib.parse from functools import reduce from pathlib import Path from dotenv import load_dotenv from pyexpat.errors import codes import chromedriver_binary from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium import webdriver # 自動的にURLより認可コードを取得して返す def main(request): POST_TOKEN_URL = "https://api.thebase.in/1/oauth/token" GRANT_TYPE_AUTHCODE = "authorization_code" # 認可コードの取得先URL GET_AUTH_URL = ( "https://api.thebase.in/1/oauth/authorize?response_type=" "code&client_id=%ID%&redirect_uri=%URI%&scope=%SCOPE%" ) load_dotenv() # BASEAPIで申請したclient_id CLIENT_ID = os.getenv("CLIENT_ID") # BASEAPIで設定したコールバックURL APP_URL = os.getenv("APP_URL") # アクセスURLの作成 auth_url = GET_AUTH_URL.replace("%ID%", f"{CLIENT_ID}") auth_url = auth_url.replace("%URI%", urllib.parse.quote(f"{APP_URL}", safe="")) auth_url = auth_url.replace("%SCOPE%", urllib.parse.quote("read_users read_orders")) chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--window-size=1280x1696') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--hide-scrollbars') chrome_options.add_argument('--enable-logging') chrome_options.add_argument('--log-level=0') chrome_options.add_argument('--v=99') chrome_options.add_argument('--single-process') chrome_options.add_argument('--ignore-certificate-errors') time.sleep(5) chrome_options.binary_location = os.getcwd() + "/bin/headless-chromium" driver = webdriver.Chrome( os.getcwd() + "/bin/chromedriver", chrome_options=chrome_options) time.sleep(5) driver.get(auth_url) # ログインIDを入力 # 検索テキストボックスの要素をname属性値から取得 login_id = driver.find_element(By.CSS_SELECTOR, "input#UserMailAddress") time.sleep(3) mail = os.getenv("MAIL") login_id.send_keys(mail) # パスワードを入力 password = driver.find_element(By.CSS_SELECTOR, "input#UserPassword") time.sleep(3) pas = os.getenv("PASS") password.send_keys(pas) print(driver.page_source) # ログインボタンをクリック login_btn = driver.find_element(By.CLASS_NAME, "submitBtn") login_btn.click() time.sleep(3) # URLから認可コードの抽出 tmp = driver.current_url.split("=")[1] code = tmp.split("&")[0] # 全てのウインドウとドライバーの終了 driver.quit() time.sleep(2) print("実行できた!") print(code) return code

試したこと

・Chromeとchromedriverのバージョンが同じか確認済み
・print(driver.page_source)でiframeがないか確認→なし

指定の仕方を変更してみた(ローカルでは問題なく実行できました。)

・driver.find_element(By.CSS_SELECTOR, "input#UserMailAddress")
→ エラー:

no such element: Unable to locate element: {"method":"css selector","selector":"input#UserMailAddress"}

・driver.find_element(By.NAME, "data[User][mail_address]")
→エラー:

no such element: Unable to locate element: {"method":"name","selector":"data[User][mail_address]"}

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

※上記のソースコードのままではローカルで動きません。

ローカルで実行確認する際は下記の削除をしてます。
・main関数の引数に入れているrequestを削除
・chromedriverとheadless-chromiumのパス削除

デプロイ時の使用コマンド (HTTPトリガー)

gcloud functions deploy test --entry-point main --trigger-http --timeout 540 --memory 512 --runtime python39 --allow-unauthenticated

参考にしたサイト
https://hacknote.jp/archives/51263/

https://tkstock.site/2022/06/14/python-selenium-developpertool-no-such-a-element/#web

ご教授いただけますと幸いです。
よろしくお願いいたします!

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Google Cloud Platform

Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

Python

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

selenium

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