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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

selenium

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

Q&A

解決済

1回答

6942閲覧

java seleniumでWEBページの読み込みを待たず、特定の要素があれば次の処理を行いたい

sha_ka_ma

総合スコア5

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

selenium

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

0グッド

0クリップ

投稿2019/10/31 00:35

編集2019/11/06 02:25

前提・実現したいこと

SeleniumのWebDraiverを使用し、ブラウザ操作の自動化を行っているのですが、
ページにアクセスし、特定の要素が表示された時点で、読み込みを待たず次の処理に進む方法が分かりません。
調べたところ、WebDriverWaitクラスとExpectedConditionsクラスを使えば要素が表示されるまで待機することが分かったので下記コードで実行を行いましたが、要素が表示されてからもページ全体の読み込みを待っているように見えます。
(要素は表示されており手動でクリックできる状態ですが、ブラウザの左下にキャッシュ待機中…などが表示され読み込みが完全に終わるのを待っている状態)

該当のソースコード

WebDriverWait

1//ページにアクセスする 2driver.get("https://"); 3//submitBtnの要素が表示されるまで最大10秒待機 4Wait<WebDriver> wait = new WebDriverWait(driver, 10); 5wait.until(visibilityOfElementLocated(By.className("submitBtn"))); 6//submitBtnをクリック 7WebElement element = driver.findElement(By.className("submitBtn")); 8element.click();

ExpectedConditions

1//ページにアクセスする 2driver.get("https://"); 3 4ExpectedCondition<WebElement> waitCondition = new ExpectedCondition<WebElement>() { 5  public WebElement apply(WebDriver driver) { 6    return driver.findElement(By.className("submitBtn")); 7 } 8 }); 9//submitBtnをクリック 10WebElement element = driver.findElement(By.className("submitBtn")); 11element.click(); 12 13wait.until(waitCondition);

上記で実行すると要素が表示されてからもページの読み込みが続行してしまうので手動でボタンを押した方が早くなってしまう状態です。
まとめると、ページ読み込み中でもボタンがあればクリックするという処理にしたいです。
勉強不足で非同期処理などあまり詳しくは分からないのですが関係があるのでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

webdriverwaitを使いましょう。
下の例ではクリックできるまで待つを基準にしていますが、他にも色々と待ち方の指定がありますので、
このサイトを参考にしてください。

python

1from selenium.webdriver.support.ui import WebDriverWait 2from selenium.webdriver.support import expected_conditions as EC 3from selenium.webdriver.common.by import By 4from selenium.common.exceptions import TimeoutException 5 6 7# 遷移する 8driver.hogehoge.click() 9 10# この例だと「クラス属性」が「submitBtn」の要素が「クリックできるようになるまで」「最大で10秒」待つ 11# 10秒以内にクリックできるようになったら次の処理へ進む 12try: 13 WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, 'submitBtn'))) 14except TimeoutException: 15 # 10秒待ってもクリックできなかった時の処理を書く 16 17# 次の処理を書く

投稿2019/10/31 09:49

shirai

総合スコア1289

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

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

shirai

2019/10/31 10:01

すいませんこれjavaでしたね。 おそらく似たような関数があると思うので探してみてください。
sha_ka_ma

2019/11/06 02:32 編集

回答ありがとうございます。 WebDriverWaitクラスを使用したのですが、要素が表示されても読み込みを待っているように見えてます。 実施した内容を追記しました。
shirai

2019/11/06 14:59

この要素が表示されるまで待ちたいという部分のDOMだけでもいただけないでしょうか。
sha_ka_ma

2019/11/07 05:34

表示されるまで待ちたい要素は下記になります。 <div class="submitBtn">
shirai

2019/11/07 17:19

DOMは正しく指定できてそうですね。。。 elementToBeClickableに変えてみてもうまくいかないでしょうか。
sha_ka_ma

2019/11/08 05:30

elementToBeClickableに変更して実行しましたが、同様にページ読み込みが終わるのを待ってからの処理になりました。 対象にしている要素が悪い場合とかあるのでしょうか・・・。
shirai

2019/11/08 05:34

いえ、悪いということはないと思います。 ちなみにですが何かエラーなどは出ていますか?
sha_ka_ma

2019/11/08 06:59

エラーはとくに出ておりません。 ブラウザ上で手動でDOMを表示させたままページの更新を行うと、画像等、全体の読み込みが完了してからDOMが表示されているように見えます。 ページの読み込みが完了してからDOMの表示なので、実際にプログラムを動かしても読み込みが完了してから処理しているように見えてしまうのでしょうか。
shirai

2019/11/08 12:31

なるほど、、、少し特殊な作りですね。 おそらくユーザーの体感速度を向上させるために 先に絵だけ表示させておいて 後からajax的なのを実行しているパターンだと思います。 そうなるとwebdriverwaitを使っても大きな効果は見込めそうにありません。 見かけ上GUI上に現れているのに後ろでDOMが出来上がっていないので 結局ボタンを押せるようになるのはその時間まで待つしかないと思います。
sha_ka_ma

2019/11/11 08:50

いずれにせよDOM表示まで待つしかないということですね。 SeleniumのWebDriver以外で解決できたり、他の方法などありますでしょうか。
shirai

2019/11/12 12:29

ajaxを回すパターンだとしたらこれはもう サーバ側の読み込み順の問題なのでどうしようも無いかと。。。
sha_ka_ma

2019/11/15 04:54

ご回答ありがとうございました。 諦めます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問