7

問題: GhostDriver API はまだアラート処理をサポートしていません。当分の間、許容できる回避策があります。それは、アラートを処理してテキストを保存する独自の JavaScript をページに挿入することです。

Python Webdriver バインディングを介してこの回避策を使用する際に問題が発生しています。これは、私の初心者レベルの JavaScript の理解に関連している可能性があります。

私が利用しようとしている回避策の例を次に示します: https://github.com/detro/ghostdriver/issues/20#issuecomment-15641983

これをより簡単にするためのアラートを示す公開サイトを使用しています: http://www.tizag.com/javascriptT/javascriptalert.php

これが私のコードです:

from selenium import webdriver

button_xpath = "/html/body/table[3]/tbody/tr/td[2]/table/tbody/tr/td/div[4]/form/input"

js = """
(function () {
var lastAlert = undefined;
window.alert = function (message) {
    lastAlert = message;
};
window.getLastAlert = function () {
    var result = lastAlert;
    lastAlert = undefined;
    return result;
};
}());
"""

driver = webdriver.PhantomJS()
driver.get('http://www.tizag.com/javascriptT/javascriptalert.php')
driver.execute_script("window.alert = %s" % js)
driver.find_element_by_xpath(button_xpath).click()
#exception just occured
driver.execute_script("return window.getLastAlert && window.getLastAlert();")

例外は次のとおりです。

WebDriverException: Message: u'Error Message => \'Click failed: TypeError: \'undefined\' is not a function (evaluating \'alert(\'Are you sure you want to give us the deed to your house?\')\')\'\n caused by Request => {"headers":{"Accept":"application/json","Accept-Encoding":"identity","Connection":"close","Content-Length":"81","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:41752","User-Agent":"Python-urllib/2.7"},"httpVersion":"1.1","method":"POST","post":"{\\"sessionId\\": \\"0eaf7680-9897-11e2-b375-55b9cb6ceb0f\\", \\"id\\": \\":wdc:1364578560610\\"}","url":"/click","urlParsed":{"anchor":"","query":"","file":"click","directory":"/","path":"/click","relative":"/click","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/click","queryKey":{},"chunks":["click"]},"urlOriginal":"/session/0eaf7680-9897-11e2-b375-55b9cb6ceb0f/element/%3Awdc%3A1364578560610/click"}' ; Screenshot: available via screen 

私はJS初心者です。誰かが私を正しい方向に向けてくれることを願っています。

4

2 に答える 2

10

簡単な解決策は、引数をグローバル変数に出力するように window.alert メソッドを書き直すことです。

オーバーライド関数を使用して js インジェクション変数を定義します。

js = """
window.alert = function(message) {
lastAlert = message;
}
"""

そして、次のように Python で execute_script 呼び出しを介して js 変数を渡すだけです。

driver.execute_script("%s" % js)

すべて実行したら、グローバル lastAlert で return を実行できます。

driver.execute_script("return lastAlert")
于 2013-04-05T16:26:38.383 に答える
4

これはいくつかの回避策です。

後でアラートが発生するリロードされたすべてのページにこれを使用します。

driver.execute_script("window.confirm = function(){return true;}");

これは、Selenium/Splinter 内の PhantomJS で機能します。

詳細については、こちらを参照してください。

于 2015-09-02T17:46:06.113 に答える