web-dev-qa-db-ja.com

pythonでSeleniumを使用してアラートが存在するかどうかを確認します

pythonユーザーを管理するWebページの言語でSeleniumを使用してテストを作成しようとしています。このページでは、ユーザーのロールを追加できます。アラートがjavascriptアラートであるかWebページの要素であるかはわかりませんリストのロールをチェックすると時間を浪費し、膨大な負荷があるため、アラートの存在を自動的にチェックしたいです。これを試しました:

browser = webdriver.Firefox()
browser.get("url")
browser.find_the_element_by_id("add_button").click()
try:
    alert = browser.switch_to_alert()
    alert.accept()
    print "alert accepted"
except:
    print "no alert"

しかし、それは機能せず、「UnexpectedAlertPresentException」を受け取りました。私もこれを試しました:

browser = webdriver.Firefox()
browser.get("url")
browser.find_the_element_by_id("add_button").click()
s = set(browser.window_handles)
s.remove(browser.current_window_handle)
browser.switch_to_window(s.pop()) 

しかし、私は同じ例外を受け取りました。さらに、firebugを使用してアラートにアクセスして、そのプロパティでアクセスできるかどうかを確認しようとしましたが、右クリックは無効になっています。他の言語でも、すぐに解決策が必要です。とにかくアプローチを理解できます。私はどんな助けにも感謝します。

49

私がやることは、アラートが表示されると予想されるポイントの直前にWebDriverWaitで条件付き遅延を設定し、次のように切り替えることです。

from Selenium import webdriver
from Selenium.webdriver.support.ui import WebDriverWait
from Selenium.webdriver.support import expected_conditions as EC
from Selenium.common.exceptions import TimeoutException

browser = webdriver.Firefox()
browser.get("url")
browser.find_element_by_id("add_button").click()

try:
    WebDriverWait(browser, 3).until(EC.alert_is_present(),
                                   'Timed out waiting for PA creation ' +
                                   'confirmation popup to appear.')

    alert = browser.switch_to.alert
    alert.accept()
    print("alert accepted")
except TimeoutException:
    print("no alert")

WebDriverWait(browser,)は、サポートされているアラートが表示されるまで少なくとも3秒待機します。

78
A.R.

これは遅すぎる答えであり、あなたは何年も前にこの質問を解決しましたが、今後の読者の参考のために私の分析と調査結果を投稿したいと思います。

Djangoウェブサイト開発プロジェクトに取り組んでいますが、現在、特定のウェブページを開くとエラーメッセージボックスが表示されるというバグがあります。私の環境は次のとおりです。

  • ジャンゴ1.8
  • Python 2.7
  • セレン2.46.0

「UnexpectedAlertPresentException」についてのドキュメント here を読みました。

予期しないアラートが表示されたときにスローされます。

通常、予想されるモーダルがそれ以上コマンドを実行するWebdriverフォームをブロックしているときに発生します。

私のプロジェクトでテストした結果は次のとおりです。

  • 警告ボックスが起動すると、_find_element_by_X_メソッドが成功する可能性があります。
  • Click()またはsend_keys()は、「UnexpectedAlertPresentException」で失敗します。

したがって、「UnexpectedAlertPresentException」が次の行にスローされるため、_try...catch_ブロックは機能しないと思います

_browser.find_the_element_by_id("add_button").click()
_

これは、次の行でWebページが開かれるとすぐに警告ボックスが表示されることも意味します。

_browser.get("url")
_

言い換えれば、ページが開かれるとすぐに警告ボックスが表示される原因となる背後に隠れた問題がある可能性があります。最初にその問題を修正する必要がある場合があります。

もう1つは、アラートボックスがafterこの行を表示すると仮定します。

_browser.find_the_element_by_id("add_button").click()
_

次に、alert = browser.switch_to_alert()は例外をスローすることなく正常に機能するはずです。これはここで説明する内容と矛盾します。これはまた、問題がbrowser.get("url")行と同じくらい早いと思いました。

私の分析は問題が別の場所にあることを示しているため、選択したソリューションがどのように問題を解決したかはよくわかりません。 とにかく、私は受け入れられた解決策を再選択することを求めていません。将来の読者のために自分の考えを共有したいだけです。この質問で何かを見落としたり誤解したりして分析が間違っている(そしてこれを読むのに時間を浪費している:-)場合に謝罪します。

6
yaobin

Javaこのようにします

WebDriverWait wait3 = new WebDriverWait(driver, 7000);
wait3.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();

アラートが存在しない場合は暗黙的にアラートを待機し、「アラートは存在しませんExceptio」をスローします。

それが役に立てば幸い。

1
Abhishek Singh
alert = self.driver.switch_to.alert
    if alert.is_displayed():
        alert.accept()
0