2010-07-13 38 views
12

Tôi muốn sử dụng Selenium để nhấp vào tab của trang web nơi tab được tạo động bằng cách sử dụng JQuery. Có một vấn đề, vì nó đã được tạo tự động và tab không có ID gắn với nó (chỉ có ID lớp được cung cấp), vì vậy tôi đang chạy ra khỏi đầu mối để bấm vào nó bằng cách sử dụng Selenium.Làm thế nào để sử dụng JQuery trong Selenium?

Sau khi googling trong 2 tuần, tôi phát hiện ra rằng nó có thể được thực hiện bằng cách sử dụng JQuery bằng cách tiêm JQuery vào Selenium và đóng gói lại để nó hỗ trợ JQuery API. Nhưng vấn đề bây giờ là tôi không biết làm thế nào để kích hoạt kịch bản JQuery trong Selenium?

Có tài nguyên nào ngoài đó hoặc hướng dẫn về cách thiết lập JQuery trong Selenium không? Làm thế nào tôi sẽ thực hiện JQuery trong Selenium?

Trả lời

9

Bạn có thể thử sử dụng lib selenium của mình tại github.

Nó xử lý gần như toàn bộ API jquery trừ các chức năng sử dụng/yêu cầu xử lý qua:

HtmlUnitDriver drv = new HtmlUnitDriver(BrowserVersion.FIREFOX_3_6); 
drv.setJavascriptEnabled(true); 
try { 
    jQueryFactory jq = new jQueryFactory(); 
    jq.setJs(drv); 

    drv.get("http://google.com"); 
    jq.query("[name=q]").val("SeleniumJQuery").parents("form:first").submit(); 

    String results = jq.queryUntil("#resultStats:contains(results)").text(); 
    System.out.println(results.split(" ")[1] + " results found!"); 
} finally { 
    drv.close(); 
} 
+0

Thật tuyệt vời và tiết kiệm rất nhiều công việc tích hợp. Cảm ơn. –

+0

Phương thức noConflict của jQuery được gọi ở đây: https://github.com/Nthalk/SeleniumJQuery/blob/master/src/com/anteambulo/SeleniumJQuery/jQueryFactory.java#L144 – Nthalk

4

Vì bạn nói rằng bạn không có một ID nhưng một lớp:

(chỉ tầm cỡ ID được cung cấp)

... một tốt hơn câu trả lời có khả năng sử dụng chiến lược định vị CSS đã được nhúng vào Selenium nơi bạn có thể chọn một phần tử dựa trên một lớp css hoặc đơn giản bằng cách sử dụng logic chọn CSS (ít nhất là css2 và css3)

Vì vậy, để chọn một phần tử (div, span bất cứ điều gì) có lớp cụ thể mà bạn chỉ đơn giản là có thể sử dụng cho định vị Selenium:

css=.class-ID 

Bạn thậm chí có thể sử dụng bộ chọn phức tạp hơn mà cũng tương tự như những người có sẵn trong JQuery như:

css=#myDiv .class-ID 

này sẽ tìm kiếm các phần tử với kiểu css là class-ID trong phần tử có ID = myDiv.

2

Bạn có thể sử dụng window.jQuery trong lệnh getEval:

|getEval | window.jQuery('div#main button').click(); | | 

Nó làm việc cho tôi trên Selenium IDE.

Đối với FF3, sử dụng wrappedJSObject để có được đối tượng jQuery:

|getEval | win = (this.page().getCurrentWindow().wrappedJSObject) ? this.page().getCurrentWindow().wrappedJSObject : this.page().getCurrentWindow() | | 
|getEval | jq = win.jQuery | | 
|assertEval | jq("div#main button").text() | click me! | 
3
  • Trước tiên, bạn có thể đọc các jquery từ một jquery.js hoặc file jquery.min.js.
  • Sau đó sử dụng execute_script (jquery) để bật jquery động.
  • Bây giờ bạn có thể tương tác với jquery.

đây là một số mã:

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: Khi tôi sử dụng Selenium để lấy một số nội dung từ một số trang web, họ luôn cấm tôi. Bây giờ bạn nên sử dụng một số proxy để đi qua nó.
đây là một số mã:

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 
3

đội Mỹ vừa hoàn thành một thư viện mà kết thúc tốt đẹp các chức năng jquery để sử dụng với Selenium. Chúng tôi vừa hoàn thành bản phát hành đầu tiên, nhưng có kế hoạch gói tất cả các chức năng của jquery. Thư viện này giúp bạn dễ dàng sử dụng jquery từ các bài kiểm tra Selenium của bạn trong C#. Nó làm cho các xét nghiệm MUCH sạch hơn. Đây là mã nguồn: https://github.com/AcklenAvenue/JQSelenium

+3

bạn đề cập đến C#, nó có hỗ trợ JAVA không? – huahsin68

Các vấn đề liên quan