2013-02-20 14 views
7

Vì vậy, chúng ta có đoạn mã sau vào trang của chúng tôi:Một con đường xung quanh phần tử không thể được cuộn vào xem - watir-webdriver với Ruby

<div class="toggle-wrapper"> 
    <input id="HasRegistration_true" class="registration_required toggle" type="radio" value="True" name="HasRegistration" data-val-required="The HasRegistration field is required." data-val="true"> 
    <label for="HasRegistration_true" class="">On</label> 
    <input id="HasRegistration_false" class="registration_required toggle" type="radio" value="False" name="HasRegistration" checked="checked"> 
    <label class="checked" for="HasRegistration_false">Off</label> 
</div> 

Đây là 2 nút radio. 'Bật' và 'Tắt'. 'Tắt' là giá trị mặc định.

Sử dụng Watir-webdriver và Ruby, chúng tôi muốn chọn nút radio 'Bật'. Chúng tôi làm như vậy như thế này:

browser.radio(:id => "HasRegistration_true").set 

Nhưng khi làm như vậy, chúng tôi nhận được lỗi sau:

`WebElement.clickElement': Element cannot be scrolled into view:[object HTMLInputElement] (Selenium::WebDriver::Error::MoveTargetOutOfBoundsError) 

Chúng ta biết Selenium 2 cuộn trang để nguyên tố này, vì vậy cố gắng để di chuyển xuống là vô ích. Chúng tôi luôn sử dụng các phiên bản mới nhất của watir-webdriver và ruby.

Chúng tôi không thể thay đổi HTML của trang vì chúng tôi là kỹ sư của QA.

+3

Tôi không thể tạo lại sự cố của bạn bằng cách sử dụng trang chỉ với html được cung cấp. Có nhiều trang được yêu cầu để tái tạo vấn đề của bạn không? Bạn đã thử trình duyệt nào (tức là nó xuất hiện trong tất cả các trình duyệt)? Bạn đề cập đến sử dụng đá quý watir-webdriver mới nhất, nhưng bạn cũng đảm bảo rằng selenium-webdriver được cập nhật? –

+0

Bạn nói "Chúng tôi biết Selenium 2 cuộn trang đến phần tử ..." Bạn có thể giải thích về điều này không? Làm thế nào bạn biết điều này? Bạn thấy nó xảy ra? –

+0

Có nhiều thứ Ajax xảy ra trên trang không? Các phần của trang được hiển thị sau khi trình duyệt được thực hiện 'tải' Vấn đề của bạn có thể xuất phát từ việc cố gắng tương tác với phần tử trước khi nó 'sẵn sàng' hoặc đã được chuyển sang vị trí cuối cùng trên trang, nói cách khác là vấn đề đồng bộ hóa. Bạn có thể thử các lệnh bằng tay thông qua IRB và xem chúng có hoạt động không, nếu có, đó thường là dấu hiệu của sự cố đồng bộ hóa –

Trả lời

0

Trước hết hãy thử định vị các yếu tố sử dụng XPath:

browser.element(:xpath, "//input[@id='HasRegistration_true']").click 

hoặc

cách khác nếu nó là một yếu tố tiềm ẩn bạn đang cố gắng xác định vị trí thì bạn nên sử dụng CSS. Tải xuống add-on firebug cho firefox và sao chép đường dẫn CSS của phần tử của bạn.

Nó phải là một cái gì đó như:

browser.element(:css => "the CSS path you have copied from Firebug").click 

Một trong những 2 nên làm điều đó cho bạn !!

Best of luck!

0

Bạn có thể thao tác html khi đang di chuyển bằng cách thực hiện một số javascript để làm cho phần tử radio có thể cài đặt được. Để thực thi javascript trên một trang, hãy thực hiện điều gì đó như: @browser.execute_script("your javascript here")

Tôi đã sử dụng một cái gì đó giống như javascript sau để tách lớp ra khỏi thẻ nhãn đã di chuyển nó ra khỏi thẻ nhập mà tôi đang cố thực hiện cho một vấn đề cụ thể của Chrome mà tôi có. execute_script("$(\"label.classname\").removeClass(\"classname inline\")")

+0

Câu hỏi không gợi ý rằng phần tử radio không thể cài đặt được; chỉ rằng họ gặp khó khăn khi di chuyển đến nó. –

0

Nếu phần tử được chứa trong một hình thức và một div (Wrap) lớp tôi thấy rằng tôi đã phải làm như sau để nhấp vào 'Không' nút radio trên trang "https://quote.comparethemarket.com/Motor/Motor/AboutYourVehicle.aspx?":

div_list = @ browser.form (: action => "? AboutYourVehicle.aspx ton_t = CTMMO & prdcls = PC & rqstyp = newmotorquote & AFFCLIE = CM01"). div (: class => "inputWrap"). divs (: class => "custom-radio")

Và sau đó: div_list [1].bấm

Hy vọng điều này giải quyết vấn đề của bạn quá :-)

1

Dưới đây là hai giải pháp mà tôi đã làm việc cho tôi:

Có một đá quý Ruby gọi watir-scroll có thể làm việc.

Sau đó

require 'watir-scroll' 
browser.scroll.to browser.radio(:id, "HasRegistration_true") 

Nếu bạn không muốn thêm một viên ngọc, đồng nghiệp của tôi đề nghị cái gì đó hơi ngạc nhiên (với tôi) có tác dụng tương tự như đoạn code trên:

browser.radio(:id, "HasRegistration_true").focus 
browser.radio(:id, "HasRegistration_true").set 

Trong mã của tôi, ".focus" được cuộn thẳng đến phần tử trước đó không hiển thị. Nó có thể làm việc cho bạn là tốt.

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