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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

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

Q&A

解決済

1回答

429閲覧

Seleniumで、要素がいずれの状態にあるかチェックする

sigefuji

総合スコア124

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

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

0グッド

0クリップ

投稿2023/04/01 12:55

実現したいこと

補足のような解析対象のhtmlがあります。
この中の
<span class="glyphicon pull-right glyphicon-chevron-down" aria-hidden="true"></span>
は、このクラスをクリックすると、
<span class="glyphicon pull-right glyphicon-chevron-up" aria-hidden="true"></span>
と、up/downが交互に変化します。
もし、upならば、クリックして、downに変化させます。
downのときに、処理を行いたいのです。

前提

それを最初から行う前に、まず、今どちらの状態にあるかをチェックすることを行いたいと思います。

そのためのコードを試しました。

期待したことは、"up"か"down"のいずれかなのですが、実行すると"fault”になります。
原因として、
・このコードではそうなるのが必然
・tryの使い方が間違っている
・その他
のいずれかと思うのですが、経験が浅く判断できません。
なおこの箇所に至るまでは、それなりに処理できているようです。
何が原因で、どうすれば目的のことができるでしょうか。

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

期待通りの処理でない。faultになる。

該当のソースコード

python

1import time 2#selenium ver 4.8.2 3from selenium import webdriver 4from selenium.webdriver.common.by import By 5from selenium.webdriver.support.ui import WebDriverWait 6from selenium.webdriver.support import expected_conditions as EC 7from selenium.common.exceptions import TimeoutException 8from selenium.webdriver.support.select import Select 9 10driver = webdriver.Chrome("c:/driver/chromedriver.exe") 11driver.get("https://eas.forexsb.com") 12wait = WebDriverWait(driver, 10) 13 14element = wait.until(EC.element_to_be_clickable((By.ID, 'user-sign-in-email'))) 15EC.element_to_be_clickable((By.ID, 'user-sign-in-email')) 16email = driver.find_element(By.ID,"user-sign-in-email") 17email.send_keys("****@****.jp") 18elem_login_pw = driver.find_element(By.ID,"user-sign-in-password").send_keys("qACSqwvD") 19elem_login_email = driver.find_element(By.ID,"user-sign-in-submit").send_keys("keys.ENTER") 20 21 22elm_confirm=wait.until(EC.element_to_be_clickable((By.ID,'eas-main-accept-legal'))) 23elm_confirm.click() 24#element.send_keys("keys.ENTER") 25 26print("confirm ok") 27time.sleep(2) 28 29elm_generator=driver.find_element(By.ID,"acquisition-link"); 30elm_generator.click() 31 32print("generator") 33 34########## 以下が問題の箇所です ######## 35 36time.sleep() 37 38xpath = "/div/h4//div/div/h4/a/span" 39try: 40 elm_updown = driver.find_element(By.CLASS_NAME("glyphicon.pull-right.glyphicon-chevron-up")) 41 print("up") 42except: 43 try: 44 elm_updown = driver.find_element(By.CLASS_NAME("glyphicon.pull-right.glyphicon-chevron-down")) 45 46 print("down") 47 except: 48 print("fault") 49 50

試したこと

この問題個所については特になし

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

ここにより詳細な情報を記載してください。
解析対象部分のHTMLコード

<div class="panel-group" id="settings-container"> <h4>Generate new strategies</h4> <div class="panel panel-default"> <div class="panel-heading"> <h4 class="panel-title"> <a data-toggle="collapse" data-parent="#settings-container" href="#collapse1">1. Historical data</a> <span class="glyphicon pull-right glyphicon-chevron-down" aria-hidden="true"></span> </h4> </div> <div class="panel-collapse collapse" id="collapse1"> <div class="panel-body"> <form class="form-horizontal form-no-submit" autocomplete="off" style="margin-bottom: 30px;"> <div class="form-group">

対象サイト
https://expert-advisor-studio.com/
trialであれば、自由に使えます。

python 3.8.11
selenium 4.11
chrome使用

パネル1、パネル2、パネル3のスクリーンショット
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

1.find_elementの使い方を間違っています。
そこより前の部分ではちゃんと書けているのに、何故ここだけ出鱈目を??

2.exceptに何も書いてないので、1のような意図しない理由での例外を握りつぶしてしまってますね。
exceptには必ず対象の例外名を書くつもりで。

3.普通はこういうことでtryは使いません。

投稿2023/04/01 13:28

編集2023/04/01 13:34
otn

総合スコア84472

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

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

sigefuji

2023/04/01 23:44

ご返事ありがとうございます。 今朝見直して、この部分に関しては、次のコードにすればup/downのいずれかになるようです。 しかしこれだけでは、OKかどうかわからないので、引き続き調べます。 xpath = "//div/div/h4/a" driver.find_element(by=By.XPATH,value=xpath) try: elm_updown = driver.find_element(By.CLASS_NAME,"glyphicon.pull-right.glyphicon-chevron-up") print("up") except: try: elm_updown = driver.find_element(By.CLASS_NAME,"glyphicon.pull-right.glyphicon-chevron-down") print("down") except: print("fault")
otn

2023/04/02 03:01

とりあえず今動けば良いという位置づけのコードならそれで良いかと思います。 今後も使い続けられるちゃんとしたコードにするには、少なくとも項番2、出来れば項番3のアドバイスに従いましょう。
sigefuji

2023/04/02 05:09

>2.exceptに何も書いてないので、1のような意図しない理由での例外を握りつぶしてしまってますね。 exceptの時は、2個目のtryを行ったつもりです。正しい書き方かどうかわかりません。 項番3は別にして、tryを使う場合の正しい書き方を教えてください。 >項番3 普通はどのように書くものでしょうか?
otn

2023/04/02 08:36

2について: > exceptには必ず対象の例外名を書く と書いたのですが。。。 except 捕捉したい例外名: です。書いた例外名以外は捕捉しないので、そのまま例外でプログラムが終了します。 今回だと、except NoSuchElementException: ですね。 3について。 全体のHTMLが不明なので、なんともですが、例えば、 driver.find_element(By.CLASS_NAME,"glyphicon.pull-right") だけでこのタグが特定できるのであれば、これでタグを取得して、クラス属性を文字列で得て、その文字列の中身をifで判断する。上記で一意に特定できないなら他の指定方法で一意に指定する。 また、一般的には「このタグが存在するかどうかわからない」という場合は、find_element じゃなくて find_elements を使ってリストで結果を取得します。 空リストなら存在しないと言うこと。空で無ければ先頭要素を使う。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問