2010-05-11 56 views
7

我一直在使用XPath和Selenium相當愉快,甚至使用getEval但只有Javascript,但一位同事說能夠使用JQuery不是很好Selenium中的選擇器。如何添加一個JQuery定位器到Selenium遠程控制

我已經使用了它,但找不到任何似乎適用於我的文章。任何人都可以提供關於如何使用JQuery語法從硒中提取doc元素及其各自值的綜合指南。

我正在使用C#編寫我的硒測試,因此如果有任何示例可能來自C#視角,那就太棒了。

感謝

回答

9

卡爾斯威德伯格寫了一篇關於它的優秀博客條目可在http://www.learningjquery.com/2009/04/better-stronger-safer-jquerify-bookmarklet

我們適應了這個,基本上在Selenium服務器jar文件,我們修改RemoteRunner.html包括了jQuery JavaScript的(從http://code.jquery.com/jquery-latest.min.js獲得)中找到:

 <script language="JavaScript" type="text/javascript" src="jquery.min.js"></script> 
     <script language="JavaScript" type="text/javascript"> 
      function openDomViewer() { 
       var autFrame = document.getElementById('selenium_myiframe'); 
       var autFrameDocument = new SeleniumFrame(autFrame).getDocument(); 
       this.rootDocument = autFrameDocument; 
       var domViewer = window.open(getDocumentBase(document) + 'domviewer/domviewer.html'); 
       return false; 
      } 
     </script> 

然後使這個在硒使用我們添加的定位策略:

mySelenium.addLocationStrategy("jquery", 
      "var loc = locator; " + 
      "var attr = null; " + 
      "var isattr = false; " + 
      "var inx = locator.lastIndexOf('@'); " + 

      "if (inx != -1){ " + 
      " loc = locator.substring(0, inx); " + 
      " attr = locator.substring(inx + 1); " + 
      " isattr = true; " + 
      "} " + 

      "var found = jQuery(inDocument).find(loc); " + 
      "if (found.length >= 1) { " + 
      " if (isattr) { " + 
      "  return found[0].getAttribute(attr); " + 
      " } else { " + 
      "  return found[0]; " + 
      " } " + 
      "} else { " + 
      " return null; " + 
      "}" 
     ); 

請注意上面的定位器策略的添加是在Java中,但它只是一個字符串,所以應該很容易在C#中複製。 JQuery的確讓事情變得更快,尤其是在Internet Explorer中!

要修改jar,可以使用java命令行工具更新下載的selenium服務器jar。在與名爲「core」的jar相同的級別上創建一個文件夾,並將修改的RemoteRunner.html和jquery.min.js文件放在那裏。然後運行是這樣的:

jar -uf selenium-server-standalone-2.0b3-APT.jar core\RemoteRunner.html 
jar -uf selenium-server-standalone-2.0b3-APT.jar core\jquery.min.js 

如果罐子是不是在你的路徑,你可以使用完整的路徑,例如在Windows上,你可以用類似執行:

"C:\Program Files\Java\jdk1.6.0_22\bin\jar.exe" <arguments> 
+0

我發現這非常有趣!但主要問題是:我們如何使用這個jQuery擴展,例如。鍵入由jquery選擇的textarea? – 2010-06-02 10:51:05

+2

@Andreas你只是使用jquery =來啓動你的定位表達式,然後使用jquery!示例定位器表達式(故意不是最簡單的示例): 「jquery = table#myParentTableID> input.input-class」 – Zugwalt 2010-06-07 15:58:12

+0

謝謝,這樣做! – 2010-06-07 16:12:04

0

你可以閱讀和execute_script啓用jQuery:

  • 首先,您可以從jquery.js或jquery.min.js文件讀取jquery。
  • 然後使用execute_script(jquery)來動態啓用jquery。
  • 現在你可以與jquery交互了。

這裏是蟒蛇一些代碼,其它語言將是類似的:

browser = webdriver.Firefox() # Get local session of firefox 

with open('jquery.min.js', 'r') as jquery_js: #read the jquery from a file 
    jquery = jquery_js.read() 
    browser.execute_script(jquery) #active the jquery lib 

#now you can write some jquery code then execute_script them 
js = """ 
    var str = "div#myPager table a:[href=\\"javascript:__doPostBack('myPager','%s')\\"]" 
    console.log(str) 
    var $next_anchor = $(str); 
    if ($next_anchor.length) { 
     return $next_anchor.get(0).click(); //do click and redirect 
    } else { 
     return false; 
    }""" % str(25) 

success = browser.execute_script(js) 
if success == False: 
    break 

PS:當我用Selenium來從一些網站上的一些內容,他們總是禁止我。現在你應該使用一些代理來檢查它。
這裏有一些代碼:

PROXY_HOST = "127.0.0.1" 
PROXY_PORT = 8087 
SOCKS_PORT = 8088 

fp = webdriver.FirefoxProfile() 

# Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5 
fp.set_preference("network.proxy.type", 1) 

fp.set_preference("network.proxy.http", PROXY_HOST) 
fp.set_preference("network.proxy.http_port", PROXY_PORT) 
fp.set_preference("network.proxy.socks", PROXY_HOST) 
fp.set_preference("network.proxy.socks_port", SOCKS_PORT) 
fp.set_preference("network.proxy.ftp", PROXY_HOST) 
fp.set_preference("network.proxy.ftp_port", PROXY_PORT) 
fp.set_preference("network.proxy.ssl", PROXY_HOST) 
fp.set_preference("network.proxy.ssl_port", PROXY_PORT) 

fp.set_preference("network.proxy.no_proxies_on", "") # set this value as desired 

browser= webdriver.Firefox(firefox_profile=fp) # with proxy 
browser = webdriver.Firefox() # no proxy 
browser.get("http://search.example.com") # Load page 

elem = browser.find_element_by_id("query_box") # Find the query input 
elem.send_keys(u'my query string') # send query string to the input 
elem.submit() # submit the query form 
相關問題