2014-04-22 35 views
5

我與硒的工作和Python,我試圖做兩件事情:硒的webdriver:execute_script不能執行自定義方法和外部JavaScript文件

  • 導入外部JavaScript文件並執行的方法定義有
  • 定義上的字符串方法和評價

此後稱它們爲第一種情況下的輸出:

test.js

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

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) 

而對於第二種情況:

>>> 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: 

回答

9

我能得到你的第一種情況,如果我創建一個空的HTML文件及發行工作:

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

之後,您顯示的JavaScript n將執行沒有問題。當我嘗試你在問題中顯示的代碼時,Firefox不會給我一個錯誤,但Chrome說:「不允許加載本地資源」。我相信問題是跨域請求。

第二種情況的問題在於,Selenium將您的JavaScript代碼封裝在一個匿名函數中。所以你的blah函數對於這個匿名函數是本地的。如果你想讓它全局的,你必須把它分配給window,像這樣:

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

感謝您的回覆,我知道在第一種情況下的錯誤,但第二種情況下,它沒」 t爲我工作(至少它不會給我更多的錯誤,但沒有任何反應)你能在哪裏工作?如果是這樣,你能分享一下代碼嗎?謝謝! – estemendoza

+0

我編輯了我的答案。 – Louis

+0

謝謝!它的工作原理是,我在沒有「()」的情況下進行調用,就像這個f.execute_script(「blah」) – estemendoza

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


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