Как я могу обработать предупреждение с GhostDriver через Python?

: API GhostDriver еще не поддерживает обработку предупреждений. Существует приемлемый обходной путь на данный момент, который заключается в том, чтобы ввести свой собственный 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 noob. Надеюсь, кто-нибудь укажет мне верное направление.

2 ответов


простое решение-переписать на окно.метод alert Для вывода аргумента в глобальную переменную.

определите переменную впрыска js с помощью функции переопределения:

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

а затем просто передайте переменную js через вызов execute_script в python следующим образом:

driver.execute_script("%s" % js)

затем, когда все это будет запущено, вы можете выполнить возврат на глобальный lastAlert:

driver.execute_script("return lastAlert")

это обходной путь.

используйте это для каждой перезагруженной страницы, которая будет иметь предупреждение позже.

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

это работает для PhantomJS в Selenium / Splinter.

Посмотреть больше ссылок здесь.