2012-01-03 41 views
7

(Tôi đã xem xét nhiều bài viết tương tự khác trên SO và đã tiếc là không thể giải quyết vấn đề này, vì vậy ở đây đi ...)Selenium WebDriver Click() không thành công với IE9

Tôi đang sử dụng Selenium WebDriver (C# triển khai, phiên bản 2.15) để lái một trang web khá đơn giản. Trang chứa biểu mẫu có hai đầu vào <> cho tên người dùng và mật khẩu và một đầu vào <> để gửi biểu mẫu. Tôi có thể nhập thành công các giá trị cho tên người dùng và mật khẩu, nhưng cuộc gọi Click() trên nút gửi dường như không có hiệu lực.

mỗi khuyến nghị khác, tôi đã thử các mẹo sau đây, không ai trong số đó đã làm việc:

  • Thay đổi cửa sổ tập trung vào currentWindowHandle
  • Bấm vào gốc phần tử, sau đó vào phần tử
  • Thêm chờ đợi lâu dài
  • Thêm thời gian chờ rõ ràng (bằng cách ngủ 20 giây)
  • Nhấp vào toàn bộ thời gian trên phần tử
  • Sử dụng Submit() thay vì Click()
  • Gửi các phím "\ n" để các phần tử (các báo cáo Selenium này như là một lỗi)

Lưu ý rằng tôi đã xác minh rằng nút < input> là thực sự được tìm thấy thành công, do đó, điều đó dường như không phải là một vấn đề.

Ngoài ra, lưu ý rằng tôi đã xác minh rằng nút thực sự hoạt động bên ngoài vùng đất Selenium. Đó là, tôi có thể duyệt đến trang web, nhập thông tin xác thực đăng nhập và nhấp vào nút gửi (và nó hoạt động!).

Ngoài ra, lưu ý rằng sự cố này là trên IE. Nó không xảy ra với tôi với Chrome và FF7.

Điều đó có nghĩa là, có ai có ý tưởng nào khác không?

Trả lời

5

Trang web của bạn có sẵn công khai để thử nghiệm không? Là IE zoom level của bạn ở mức 100%? Đó là một yêu cầu cho các sự kiện nhấp chuột mẹ đẻ để làm việc từ tài liệu mức độ phóng here

Trình duyệt phải được thiết lập đến 100% để các con chuột có nguồn gốc sự kiện có thể được thiết lập để các tọa độ chính xác.

Nếu điều này không hoạt động thì có vẻ như lỗi trong trình quản trị web. Bạn nên mở một vấn đề here.

Có nói điều này, có thể bạn có thể đi các tuyến đường kịch bản Java trong khi đó là một giải pháp tạm thời. Một cái gì đó như,

driver.navigate().to("javascript:document.getElementById('yoursubmitbutton').click()"); 
+0

Tôi làm cách nào để đặt mức thu phóng IE? –

+0

Đúng, nó thực sự là mức thu phóng. Cảm ơn! Mặc dù tôi thực sự cần một cách để phát hiện lập trình và/hoặc đặt mức thu phóng. Tôi không thể có các bài kiểm tra của tôi thất bại cho tất cả thời gian này ... –

2

Dường như có thể có vấn đề với trong đó nhấp chuột xảy ra. Tôi đã thử sử dụng cơ chế Hành động trong Selenium để buộc nhấp chuột với một chút bù đắp. Thành công nhấp vào yếu tố:

new Actions(GuiOps.driver).MoveToElement(e).MoveByOffset(5,5).ClickAndHold().Release().Perform(); 
1

Tôi gặp sự cố này.Tôi không thể nhớ những bài mà tôi tìm thấy giải quyết nhưng tôi thấy rằng sau đây làm việc cho tôi:

Trên một nút:

var navButton = driver.FindElement(By.Id("NavButton")); 
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].fireEvent('onclick');", navButton); 

Làm việc mọi lúc.

Tôi cũng gặp sự cố khi gửi sự kiện nhấp chuột đến hàng trong bảng. Đôi khi .Click() thực sự sẽ gửi sự kiện đến hàng trên (chúng tôi có một cấu trúc bảng phức tạp khủng khiếp có nút radio ẩn bên trong nó cũng không thể nhấp được với Selenium). Các hack trên sẽ không hoạt động với các tế bào có thể truy cập thông qua một FindElement.

Cuối cùng, điều duy nhất hoạt động là chọn hình ảnh trong hàng đó và gửi nhấp chuột đó.

var img = driver.FindElement(By.Id("fim{4C3DE9FA-45B0-40E0-BD95-9EE0374EA38A}")); 
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].fireEvent('onclick');", img); 

Hy vọng điều đó sẽ hữu ích.

-1

Một workaround tốt hơn có thể được lặp đi lặp lại như cách nhấn như:

Btn.click(); 
Btn.click(); 

Bởi vì 1 nhấp chuột chỉ cần đặt trọng tâm và là một trong 2 thực hiện các nhấp chuột thực sự. Nó làm việc cho tôi.

+2

Vấn đề với điều này là nếu bạn thử nghiệm với nhiều trình duyệt, nhấp chuột đầu tiên sẽ thực hiện một hành động, sau đó nhấp chuột thứ hai sẽ ném một ngoại lệ bởi vì nó không thể tìm thấy phần tử. – boolean

1

Tôi thấy nhiều giải pháp ở đây, nhưng tôi nghĩ rằng tôi sẽ chia sẻ những gì làm việc cho tôi trong trường hợp bất cứ ai khác ra khỏi đó cần một cách tiếp cận khác nhau. Tôi đã có một vấn đề tương tự, đối với tôi là giải pháp đơn giản như bấm sử dụng một phương pháp khác nhau

Ví dụ

btn.Sendkeys(Keys.Enter); 
0

Sử dụng FindElement(By.CSSSelector("'CSSPath'")); Nếu bạn có bất kỳ CSS nào được áp dụng cho nút, nó nhất quán hơn sẽ viết các câu lệnh khác để tìm phần tử có các phương tiện thay thế như ID, thẻ hoặc bằng WebDriverWait Phương thức

0

Có thể bạn cần đặt Bật Sự kiện Gốc thành "true" khi bạn đang chạy nó trên IE và nếu bạn muốn chạy cùng một mã trong FF và Chrome, thì bạn cần phải bật Sự kiện gốc thành "true" trong các Trình duyệt đó.

Bạn có thể làm điều đó khi bạn đang đặt Trình duyệt mà bạn muốn chạy.

0

đang Try -

driver.FindElement(By.Id("btn")).sendkeys("\n"); 
0

thử này ..
WebElement hiddenWebElement = d.findElement (By.xpath (xpath));
((JavascriptExecutor) d) .executeScript ("đối số [0] .click()", hiddenWebElement);

0

Sau đây làm việc cho tôi:

@FindBy(id = "submit_action") 
WebElement submitButton_; 
... 
public void clickSubmit() { 

    if (driver_ instanceof InternetExplorerDriver) { 
     ((JavascriptExecutor) driver_).executeScript("arguments[0].fireEvent('onclick');", submitButton_); 
    } 
    else { 
     submitButton_.click(); 
    } 
} 

Như fireEvent chỉ được hỗ trợ bởi trình duyệt IE vì vậy giải pháp thay thế.

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