2013-03-29 1 views
6

문제점 : GhostDriver API는 경고 처리를 아직 지원하지 않습니다. 당분간은 경고를 처리하고 텍스트를 저장할 페이지에 자신의 자바 스크립트를 삽입하는 것이 가능한 해결 방법이 있습니다.GhostDriver에서 Python을 통해 경고를 처리하려면 어떻게합니까?

python webdriver 바인딩을 통해이 대안을 사용하는 데 문제가 있습니다. 그것은 초보자 수준의 자바 스크립트 이해와 관련이있을 수 있습니다. http://www.tizag.com/javascriptT/javascriptalert.php 여기

내 코드입니다 : 내가 알림이 더 간단하게 보여줍니다 공개 사이트를 사용하고 https://github.com/detro/ghostdriver/issues/20#issuecomment-15641983

을 : 여기

내가 사용하는 것을 시도하고 해결 방법의 예입니다 :

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 
,536,913,632 10

저는 JS 놈입니다. 나는 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바라고 있습니다.

답변

10

간단한 해결책은 window.alert 메서드를 다시 작성하여 인수를 전역 변수에 출력하는 것입니다.

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

을 그리고 그냥이 같은 파이썬에서 execute_script의 호출을 통해 JS 변수를 전달합니다 :

재정의 기능과 JS 주입 변수를 정의가 모두 실행 된 때 그런

driver.execute_script("%s" % js) 

글로벌 lastAlert에 대한 수익을 실행할 수 있습니다.

driver.execute_script("return lastAlert") 
+0

Yup! 완벽하게 작동합니다. 감사! – brma

4

T 그의 해결 방법입니다.

경고가 나중에 다시로드되는 모든 페이지에이 값을 사용하십시오.

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

이것은 셀레늄/스프린터 내 PhantomJS 작동합니다.

참고 자료 here을 참조하십시오.

+1

이것은 분명하게 보일지 모르겠지만 ** 버튼을 클릭하기 전에 (또는 경고가 생성되기 전에) javascript **를 실행해야한다는 것을 깨닫는 데 꽤 시간이 걸렸습니다. – user3745794