2014-04-22 6 views
5

pracuję z selenem i Python i próbuję zrobić dwie rzeczy:Selen Webdriver: execute_script nie można wykonać niestandardowe metody i zewnętrznych plików javascript

  • importować zewnętrzny plik JavaScript i wykonać metodę zdefiniowane tam
  • Definiowanie metod na sznurku i nazywają je po ocenie

jest to wyjście dla pierwszego przypadku:

test.js

function hello(){ 
    document.body.innerHTML = "testing"; 
} 

kod Python

>>> from selenium import webdriver 
>>> f = webdriver.Firefox() 
>>> f.execute_script("var s=document.createElement('script');\ 
...        s.src='file://C:/test.js';\ 
...        s.type = 'text/javascript';\ 
...        document.head.appendChild(s)") 
>>> f.execute_script("hello") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\site-packages\selenium-2.41.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 394, in execute_script 
{'script': script, 'args':converted_args})['value'] 
    File "C:\Python27\lib\site-packages\selenium-2.41.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 166, in execute 
self.error_handler.check_response(response) 
    File "C:\Python27\lib\site-packages\selenium-2.41.0-py2.7.egg\selenium\webdriver\remote\errorhandler.py", line 164, in check_response 
raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: u'hello is not defined' ; Stacktrace: 
    at anonymous (about:blank:68) 
    at handleEvaluateEvent (about:blank:68) 

I za drugim przypadku:

>>> js = "function blah(){document.body.innerHTML='testing';}" 
>>> f.execute_script(js) 
>>> f.execute_script("blah") 
    ... 
    raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: u'blah is not defined' ; Stacktrace: 

Odpowiedz

9

mogę dostać swoją pierwszą sprawę do pracy jeśli utworzyć pusty plik HTML i problem:

f = webdriver.Firefox() 
f.get("file://path/to/empty.html") 

Po tym, JavaScript, który pokazałeś n zostanie wykonane bez problemu. Kiedy próbuję kodu, który pokazałeś w pytaniu, Firefox nie daje mi błędu, ale Chrome mówi: "Nie wolno ładować zasobów lokalnych". Uważam, że problemem są żądania między domenami.

Problem z drugim przypadkiem polega na tym, że za kulisami Selenium owija twój kod JavaScript w anonimową funkcję. Zatem twoja funkcja blah jest lokalna dla tej anonimowej funkcji. Jeśli chcesz, aby to globalny, trzeba przypisać go do window, tak:

>>> from selenium import webdriver 
>>> f = webdriver.Firefox() 
>>> f.execute_script("window.blah = function() {document.body.innerHTML='testing';}") 
>>> f.execute_script("blah()") 
+0

Dzięki za odpowiedź, rozumiem błąd na pierwszym przypadku, ale drugi przypadek, to nie zrobił” t działa dla mnie (przynajmniej nie daje mi więcej błędów, ale nic się nie dzieje) Gdzie możesz to zrobić? Jeśli tak, czy mógłbyś udostępnić kod ?. Dzięki! – estemendoza

+0

Edytowałem swoją odpowiedź. – Louis

+0

Dzięki! Zadziałało, dzwoniłem bez "()" jak ten f.execute_script ("bla") – estemendoza

1
driver.execute_script("window.a = function(a,b) {return a + b;}") 


print driver.execute_script("return a(1,2)")