2011-06-11 39 views
1

我想在與紅寶石硒webdriver的jquery定位器。這裏是我的代碼:在硒webdriver處理jQuery的定位器,紅寶石

require "selenium-webdriver" 

driver = Selenium::WebDriver.for(:remote, :desired_capabilities => :firefox) 
driver.navigate.to("http://google.com") 

# input.lst is the search input text in google.com 
selector = "input.lst" 

# get element from the locator 
element = driver.execute_script("return $(#{selector}).get(0);") 

# type "google" into the input text 
element.send_keys "google" 

我試圖元= driver.find_element()工作得很好,所以我想也許有做所有的jQuery的定位更普遍的方式。這就是爲什麼我嘗試execute_script。但是,似乎execute_script函數已損壞。我從sun.reflect,java.lang或org.openqa得到了很多錯誤...

P/S:如果有人知道如何在webdriver add_location_strategy,請告訴我關於它:D。它在硒中非常出色,我找不到在webdriver中實現它的方法。

+0

如果您向我們展示了您遇到的錯誤,它會更容易幫助。代碼看起來很好,除了Google不在他們的頭版上使用jQuery。 – jarib 2011-06-12 14:03:44

+0

這是我得到的: [遠程服務器] sun.reflect.NativeConstructorAccessorImpl():-2:在'newInstance0' :$沒有定義(警告:服務器沒有提供任何堆棧跟蹤信息 on)(Selenium: :WebDriver :: Error :: UnhandledError) 驅動程序信息:driver.version:EventFiringWebDriver(org.openqa.selenium.WebDriver 例外) .... 我只是使用jQuery定位器來選擇元素。 – BaoNgoc 2011-06-12 14:11:56

回答

1

導航到所需的頁面之後,但使用jQuery前:

# load the JavaScript file into memory as a string 
jQuerify = ... 

# add jQuery to the current page 
driver.execute_async_script(jQuerify) 

這裏提到的JavaScript文件:

/*** dynamically load jQuery ***/ 
(function(callback) { 
    var JQUERY_URL = 'http://code.jquery.com/jquery-latest.min.js'; 
    if (typeof jQuery == 'undefined') { 
     var script=document.createElement('script'); 
     script.src = JQUERY_URL; 
     var head = document.getElementsByTagName('head')[0]; 
     var done = false; 
     script.onload = script.onreadystatechange = (function() { 
      if (!done && (!this.readyState 
        || this.readyState == 'loaded' 
        || this.readyState == 'complete')) { 
       done = true; 
       script.onload = script.onreadystatechange = null; 
       callback(); // tell WebDriver we are done 
       head.removeChild(script); 
      } 
     }); 
     head.appendChild(script); 
    } 
    else { 
     callback(); 
    } 
})(arguments[arguments.length - 1]); 

這個片段將被粘貼到人體的匿名函數WebDriver,將jQuery放在全局範圍內。應該緩存文件內容以重複調用。

(從jQuerify大量舉債)

哦,一般來說,你應該選擇元素時堅持Ruby API。直接使用JavaScript被認爲是一種解決方法,與WebDriver的精神背道而馳。