2012-04-20 33 views
5

Tôi có điều này:Nhấp liên kết với JavaScript trong mechanize

<a class="top_level_active" href="javascript:Submit('menu_home')">Account Summary</a> 

Tôi muốn nhấp vào liên kết đó, nhưng tôi nhận được một thông báo lỗi khi sử dụng link_to.

Tôi đã thử:

bot.click(page.link_with(:href => /menu_home/)) 
bot.click(page.link_with(:class => 'top_level_active')) 
bot.click(page.link_with(:href => /Account Summary/)) 

Các lỗi tôi nhận được là: NoMethodError: Phương pháp xác định `[]' cho nil: NilClass

Trả lời

13

Đó là liên kết javascript. Cơ chế sẽ không thể nhấp vào nó, vì nó không đánh giá javascript. Lấy làm tiếc!

Cố gắng tìm hiểu điều gì sẽ xảy ra trong trình duyệt của bạn khi bạn nhấp vào liên kết đó. Nó có tạo yêu cầu POST hoặc GET không? Các tham số được gửi tới máy chủ là gì. Một khi bạn biết điều đó, bạn có thể mô phỏng hành động tương tự trong kịch bản Cơ chế của bạn. Công cụ Chrome dev/Firebug sẽ giúp ích.

Nếu cách này không hiệu quả, hãy thử chuyển sang thư viện hỗ trợ đánh giá javascript. Tôi đã sử dụng watir-webdriver để thành công lớn, nhưng bạn cũng có thể dùng thử phantomjs, casperjs, pjscrape hoặc các công cụ khác

+0

cảm ơn, tôi đã sử dụng một bài để tải trang và nó làm việc. – user1198316

1

2 đầu tiên nên đã làm việc rất cố gắng này, in ấn ra khỏi href để đảm bảo rằng nó thực sự ở đó:

puts page.links.map(&:href) 

Hãy nhớ rằng chỉ vì bạn có thể nhìn thấy nó trong trình duyệt của bạn không có nghĩa là nó xuất hiện trong phản hồi. Nó có thể đã được gửi như một bản cập nhật ajax. Ngoài ra bạn chỉ có thể làm mà điều này tôi nghĩ là sạch hơn:

page.link_with(:href => /menu_home/).click 

Tuy nhiên tôi không nghĩ cách nhấn vào liên kết đó sẽ làm những gì bạn muốn vì nó javascript.

0

Đây là cách để xử lý. Giả sử lợi nhuận trang của bạn nội dung này:

puts page.body 
<HTML><SCRIPT LANGUAGE="JavaScript"><!-- 
    top.location="http://www.example.com/pages/myaccount/dashboard.aspx?"; 
// --></SCRIPT> 
<NOSCRIPT>Javascript required.</NOSCRIPT></HTML> 

Chúng tôi biết nó đến để chúng tôi biết những gì để kiểm tra:

link_search = %r{top.location="([^"]+)"} 
js_link = page.body.match(link_search)[1] 
page = agent.get(js_link) 
Các vấn đề liên quan