web-dev-qa-db-ja.com

Python警告ではないブラウザウィンドウのポップアップを処理するwebdriver

リンクをクリックすると別のポップアップウィンドウが表示されるWebアプリケーションで作業しています。ポップウィンドウはアラートではなく、ユーザーが入力するさまざまなフィールドを持つフォームであり、[次へ]をクリックします。

Seleniumを使用して、このポップアップウィンドウをどのように処理/自動化できますか。

要約:-

  1. ハイパーリンク(URL)をクリックします-「ここをクリック」
  2. ユーザー登録フォームがポップアップとして表示されます
  3. データはユーザーが入力します
  4. [次へ]/[送信]ボタンをクリックします。
  5. 次に別のページ/フォーム「ユーザー個人情報ページ」にリダイレクトされた別の
  6. 個人情報はユーザーが入力します
  7. [次へ/送信]をクリックします
  8. ポップアップが消えました。
  9. オリジナル/ベースページでさらに処理します。
22
Ronu

ポップアップへの切り替えは、少なくとも次の2つの理由から困難です。

  1. 多くの人が知っているもの、つまり、ポップアップが表示されるとき、ポップアップウィンドウで要素を見つけられるようにするため、およびポップアップが閉じられた後に見つけるために、driver.switch_to.window(window_handle)を使用する必要があるメインウィンドウに戻る要素。
  2. 遅いマシンを持つ人だけが遭遇する可能性が高いものです。つまり、Seleniumが変数としてウィンドウハンドルを使用可能にすると、最初はNoneに設定され、値が入力されるまで少し時間がかかります。

要求されたシーケンスを実行しながら、これらの問題に対処するコードを次に示します。私はimportステートメントを省いており、明らかだと思っている変数名を使用しています。また、コードでfind_element(s)_by_xpathを使用したいことに注意してください。他のfind_element(s)_byメソッドを自由に使用してください:

main_window_handle = None
while not main_window_handle:
    main_window_handle = driver.current_window_handle
driver.find_element_by_xpath(u'//a[text()="click here"]').click()
signin_window_handle = None
while not signin_window_handle:
    for handle in driver.window_handles:
        if handle != main_window_handle:
            signin_window_handle = handle
            break
driver.switch_to.window(signin_window_handle)
driver.find_element_by_xpath(u'//input[@id="id_1"]').send_keys(user_text_1)
driver.find_element_by_xpath(u'//input[@value="OK"]').click()
driver.find_element_by_xpath(u'//input[@id="id_2"]').send_keys(user_text_2)
driver.find_element_by_xpath(u'//input[@value="OK"]').click()
driver.switch_to.window(main_window_handle) #or driver.switch_to_default_content()

誰か(おそらく私)が例をさらに追加する必要があるかどうか、またはより明確にするために他の情報を提供する必要があるかどうかを教えてください。

39
Lindsay

新しいwindowまたはiframeの場合は、driver.switch_to_frame(webelement)またはdriver.switch_to_window(window_name)を使用する必要があります。これにより、ポップアップ内でelementsと対話できるようになります。完了したら、driver.switch_to_default_content()してメインWebページに戻る必要があります。

6
Mark Rowlands