2013-03-29 9 views
6

Problem: Interfejs API GhostDriver nie obsługuje jeszcze obsługi alertów. Na razie możliwe jest obejście tego problemu, czyli wstrzyknięcie własnego javascript na stronę, która będzie obsługiwać alert i przechowywać dla niego tekst.Jak mogę obsłużyć alert z GhostDriver za pośrednictwem Pythona?

Mam problem z użyciem tego obejścia za pomocą powiązań webhostów python. Może to być związane z moim nowicjackim poziomem zrozumienia javascript.

Oto przykład z obejścia próbuję wykorzystać: https://github.com/detro/ghostdriver/issues/20#issuecomment-15641983

Używam witryny publicznej, który pokazuje alert, aby to bardziej prosta: http://www.tizag.com/javascriptT/javascriptalert.php

Oto mój kod:

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();") 

wyjątek:

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 

Jestem nosem JS. Mam nadzieję, że ktoś wskaże mi właściwy kierunek.

Odpowiedz

10

Prostym rozwiązaniem jest przepisanie metody window.alert na wyjście argumentu do zmiennej globalnej.

Zdefiniuj zmienną wtrysku js z funkcją override:

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

A potem po prostu przekazać zmienną js poprzez wywołanie execute_script w python jak ten:

driver.execute_script("%s" % js) 

potem, gdy to wszystko jest prowadzony możesz wykonać zwrot na globalnym koncie lastAlert:

driver.execute_script("return lastAlert") 
+0

Yup! Działa świetnie. Dzięki! – brma

4

T jego jest kilka obejść.

Służy do tego w przypadku każdej ponownie załadowanej strony, która będzie miała późniejszy alert.

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

Działa to dla PhantomJS w Selenium/Splinter.

Zobacz więcej referencji here.

+1

To może wydawać się oczywiste, ale zajęło mi trochę czasu, aby zdać sobie sprawę, że musisz wykonać javascript ** przed ** kliknięciem przycisku (lub przed wygenerowaniem alertu) – user3745794

Powiązane problemy