clickすると、非表示になる要素での操作方法について

586 views
Skip to first unread message

竹田智和

unread,
Jun 2, 2020, 6:07:20 AM6/2/20
to 日本Seleniumユーザーコミュニティ
はじめまして。諸先輩方のアドバイスを頂ければと思い、投稿します。

業務の一環で弊社のwebアプリケーションの操作をjava+seleniumで(できる範囲を)行うということを行っているのですが、下記の操作を行わせる度に処理が止まってしまいます。

行いたい操作:
  1. デフォルトで表示されている検索モード切り替えのリンクをクリック→「詳細検索」画面が表示される
  2. 表示された詳細検索画面にある各項目を入力して詳細検索
引っかかているのが上の1の操作を行った際、ブラウザ上では要素(検索キー入力ボックスなど)が表示されているにも関わらず
その項目を取得できないように見えることです。

ブラウザの開発モードで確認したところ、1の操作を行うとクリックした要素を含むdivタグ全体が"display:none"となるように作られており、
seleniumが見ている要素が行方不明になっているように見えます。(であってるのかな?)

当初の操作1~2を行わせるようにするにはどのように処理を記述したらよろしいかアドバイスをお願いします。

環境は以下になります。
  • 言語:java(jdk11)
  • IDE:Eclipse
  • ブラウザ:Chrome83

藤田光

unread,
Jun 2, 2020, 8:38:40 AM6/2/20
to 日本Seleniumユーザーコミュニティ
こんばんわ。業務の効率化素晴らしいですね。
すでにお試しかもしれませんが、styleがdisplay:noneだから項目を取得できないのかを確認するために、
無理やりnoneを解除して、取得できるか確認してみてはいかがでしょうか(Javaをまともに書けないので、Pythonで書いてます(つもり))
driver.execute_script("document.getElementById('example_div_id').st‌​yle.display='none';‌​")
find_element_by_id
('example_text_id').get_attribute("textContent")
ただし、これで取得できたからと言って、このまますすめるのが良いかといえばNoだと思います。
解除した時点でサイト上の状態が破綻してしまっている可能性があり、他の操作に影響があるかもしれないからです。

どういう操作をしたいのかがわかりませんので想像ですが、
詳細検索画面を表示する前に入力されている値を、詳細検索画面を表示したあとに再利用したいのであれば、
詳細検索画面を表示する前に入力されている値を変数や外部ファイルに保存してから、
詳細検索画面を表示し、詳細検索画面を表示したあとに、その変数や外部ファイルを参照して利用するような設計を検討されてはいかがでしょうか。

大外れかもしれませんが。

2020年6月2日火曜日 19時07分20秒 UTC+9 竹田智和:

竹田智和

unread,
Jun 2, 2020, 8:40:55 PM6/2/20
to 日本Seleniumユーザーコミュニティ
藤田さん

回答いただきありがとうございます。

こちらも頭ひねりながら実装してデバッグという状態でして結構大変です。
しっかしjavaで実装する方少ないんでしょうかねぇ(stackoverflowでも少ない感じですし)…。
まぁライブラリのバージョンの上がり方が一番遅くて助かっているとも言えるんでしょうが(汗


2020年6月2日火曜日 21時38分40秒 UTC+9 藤田光:

Mieko Furuhashi

unread,
Jun 5, 2020, 1:39:42 AM6/5/20
to 日本Seleniumユーザーコミュニティ
私もJavaで実装してますよ。というのも開発チームがJavaなのでそれでJavaを使ってます。

display:noneだと人間の目にも見えてないはずなのでなにを隠しているのかですよね。

エラーが出ているとおもうのですが、どんなですか?

おそらく、要素を取得する値が間違ってるか、WebDriverが要素が表示される前に取得を行っているのが原因かと思います。人間の目にはその様に見えていても、じつはWebDriverには違うかもしれないので待つのがいいかもしれません。

検索モード切り替えのリンクをクリックしたのち、「詳細検索」画面にある入力要素の表示を待つ、それから値を入力すると行けるかもしれません。

FluentWait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(Duration.ofSeconds(2))
.pollingEvery(Duration.ofMillis(500))
.ignoring(NoSuchElementException.class)
.ignoring(StaleElementReferenceException.class);

wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("input-field"))).sendKeys("検索する要件");
Reply all
Reply to author
Forward
0 new messages