13

開発中の Web アプリケーションをテストしようとしています。Firefox 22.0 に対して Firefox ドライバーを使用しています。

ある時点で、モーダル ダイアログがポップアップする場合があります (Javascript prompt())。含まれている場合は、テキストを入力してから閉じます ([OK] をクリックします)。

関連するコードは次のとおりです。

try:
    if button.text == "Run":
        button.click()
except UnexpectedAlertPresentException:
    alert = self.driver.switch_to_alert()
    print alert.text
    alert.send_keys('8080')
    alert.dismiss()

UnexpectedAlertPresentException 投げられています。ただし、実行しようとするとすぐにprint alert.text、次のようになります。

`NoAlertPresentException: Message: u'No alert is present'`.

printステートメントを削除すると、次のように爆発しalert.send_keysます:

`WebDriverException: Message: u'fxdriver.modals.find_(...) is null'`

理解できません。定義上、スローされ、except ブロックが最初に実行される原因とNoAlertPresentException矛盾していませんか?UnexpectedAlertPresentException

編集:また、私は一生、UnexpectedAlertPresentExceptionhttp ://selenium.googlecode.com/svn/trunk/docs/api/py/index.html#documentationでドキュメントを見つけることができません

編集2:これは私が今持っているものです:

try:
    if button.text == "Run":
        button.click()

        alert = self.driver.switch_to_alert()

        alert.send_keys('1111')
        alert.dismiss()

 except NoAlertPresentException:
     pass

しかし、私はまだこれを見ています:

WebDriverException: Message: u'fxdriver.modals.find_(...) is null' 

ラインでalert.send_keys('8080')switch_to_alert()アラートがない場合にスローしない理由が理解できないと思いNoAlertPresentます...これは、WebDriverExceptionが示していると想定しているものです。

4

3 に答える 3

3

I think Selenium closes unexpected alerts. Apparently you can change how the firefox driver treats unexpected alerts: How to handle an Alert with "UnexpectedAlertBehaviour" capability in Selenium?

As an alternative, you could check if there is an alert before acting (after all, if you want handle the alert it's not unexpected) like so (Java):

try {
  Alert alert = _driver.switchTo().alert();
  //do stuff with alert
} catch (final NoAlertPresentException e) {
  //do non-alert stuff
}
于 2013-07-10T17:45:06.313 に答える
2

1 週間前に始めたので、私は最高の Python プログラマーではないかもしれません。私は自分自身を管理して、すべてのアラートを受け入れる小さな関数を作成し、さらにアラートを実行します。

-2 行目 (テールから 2 番目) で IF を WHILE に変更すると、連続する確認/アラートも処理できます。IF を使用すると、confirm() の応答を処理できます。WHILE を使用すると、すべてのアラート() を処理できます。アラートがタイムアウトになっている場合は、正しいタイミングで alert() を「バイパス」する必要があります。

uknown alerts() をバイパスし、alert() が存在しないときに停止するために、2 つの例外ハンドラーを追加することができました。

import selenium
from selenium import webdriver
import os
import time
from selenium.common.exceptions import UnexpectedAlertPresentException
from selenium.common.exceptions import NoAlertPresentException

os.system("pkill php")
os.system("php -S localhost:2222 alert.html &")

fire = webdriver.Firefox()
fire.get("http://localhost:2222")
global alert

def alert_accept():
  try:
    alert = fire.switch_to_alert()
    print "Aler text:" + alert.text
    alert.accept()
    print "Alert detected, accept it"
    return True
  except UnexpectedAlertPresentException:
    print "Hum..., continue?"
    return False
  except NoAlertPresentException:
    print "No alert here"
    return False

while alert_accept() == True:
  alert_accept()

どのWebサイトでもテストできません。それについて少し掘り下げるために、いくつかの異なるアラートを含むローカルhtmlを作成しました。

HTML コード:

<script type="text/javascript">
var c = confirm("Do you like kidding yourself?")
if (c == true) {
  alert("true")
} else {
  alert("You're the kidding master, another alert!")
}
</script>

<script type="text/javascript">
var c = confirm("Do you like kidding yourself?")
if (c == true) {
  alert("true")
} else {
  alert("You're the kidding master, another alert!")
}
</script>

<script type="text/javascript">
console.log("Running test with timeout")
</script>

<script type="text/javascript">
setTimeout(function(){ 
  var c = confirm("Do you like kidding yourself?")
if (c == true) {
  alert("true")
} else {
  alert("You're the kidding master, another alert!")
}
 }, 5000)
</script>

実際、WHILEもIFもページ全体を処理します。タイムアウトのためだと思います。一度にすべてを入れると、そうです。

これは、暗黙の待機と、最短のコードで予想される条件を使用して実行できると確信しています。alert_is_present のソースを見ると、true/false を返す try:block 以外には何も表示されません。

于 2015-06-09T07:46:38.897 に答える
1

私の場合、[ファイル] を選択せず​​に [アップロード] ボタンをクリックし、警告メッセージが表示されるかどうかを確認する必要があります。しかし、私の場合、アップロードボタンをクリックすると、以下の例外が発生します selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text: Message: Modal dialog present 私の場合、alert.accept または alert.dismiss が機能していません[アップロード] ボタンを選択し、Python コードで Enter キーを押します。その作業は完璧です。

于 2017-06-16T07:53:20.800 に答える