2013-07-08 74 views
38

Giả sử tôi có một input trong một biểu mẫu (trông giống như một nút và tương tác giống như một nút) tạo ra một số dữ liệu (tốt, máy chủ tạo dữ liệu dựa trên các tham số biểu mẫu, nhưng đối với người dùng, nút đó sẽ :)) dựa trên các tham số trong biểu mẫu.Trình duyệt Web Selenium submit() vs click()

Khi tôi sử dụng click(), toàn bộ quá trình bị treo (thực sự bị treo, không có ngoại lệ hoặc lỗi).

Từ trang web Selenium:

// Now submit the form. WebDriver will find the form for us from the element 
element.submit(); 

Vì vậy WebDriver có một phương pháp submit(). Có sự khác biệt nào, logic khôn ngoan, giữa việc sử dụng một số click() trên một nút hoặc submit()?

Trả lời

41

Chức năng submit() có sẵn để giúp cuộc sống trở nên dễ dàng hơn. Bạn có thể sử dụng nó trên bất kỳ phần tử nào bên trong thẻ biểu mẫu để gửi biểu mẫu đó.

Bạn cũng có thể tìm kiếm nút gửi và sử dụng click().

Vì vậy, sự khác biệt duy nhất là click() phải được thực hiện trên nút gửi và submit() có thể được thực hiện trên bất kỳ phần tử biểu mẫu nào.

Tùy thuộc vào bạn.

http://docs.seleniumhq.org/docs/03_webdriver.jsp#user-input-filling-in-forms

+0

ah, vì vậy không có sự khác biệt về thực thi. Tôi đã tìm ra điều đó nhiều. Việc đóng băng phải xảy ra từ một nguồn khác/IE trục trặc ... thực sự không thích IE + selenium. Cảm ơn bạn đã trả lời. – CosminO

+4

Đó là về mặt kỹ thuật không đúng sự thật - sự khác biệt là một sự kiện sẽ kích hoạt sự kiện nhấp chuột vào yếu tố đầu vào của loại gửi và khác sẽ kích hoạt sự kiện gửi trên phần tử biểu mẫu. Nếu bạn có mã chỉ kích hoạt trên sự kiện nhấp của đầu vào thì điều này sẽ không xảy ra khi bạn sử dụng chức năng gửi. –

+0

Ngoài ra còn có một sự khác biệt quan trọng, ít nhất là đối với phiên bản .net sử dụng chromedriver, gửi sẽ đợi trang tải, bấm không phải là garanteed.to đợi –

22

Có sự khác biệt giữa click() và gửi().

gửi() gửi biểu mẫu và thực thi url được cung cấp bởi thuộc tính "hành động". Nếu bạn có bất kỳ javascript-function hoặc jquery-plugin nào đang chạy để gửi biểu mẫu, ví dụ: thông qua ajax, submit() sẽ bỏ qua nó. Với click() các hàm javascript sẽ được thực hiện.

+1

Tức là. Hầu hết giao diện người dùng hiện đại đều có chức năng kích hoạt javascript trong khi nhấp vào hầu hết các nút do sử dụng rộng rãi jQuery. webdriver.submit() giống như một hàm "form2url". Đây là lý do tại sao nó có thể được kích hoạt bằng bất kỳ phần tử nào khác, kể cả bên ngoài biểu mẫu bởi vì nó không liên quan gì đến webelement, chỉ nhận các giá trị từ cá thể biểu mẫu đầu tiên. Nếu bạn muốn kích hoạt một biểu mẫu không phải là biểu mẫu đầu tiên, bạn nên lấy phần tử biểu mẫu đầu tiên hoặc loại bỏ các phần tử khác. – erm3nda

6

Ngoài ra, chính xác cho tôi nếu tôi sai, nhưng tôi tin rằng gửi sẽ chờ đợi cho một trang mới để tải, trong khi bấm ngay lập tức sẽ tiếp tục thực thi mã

+2

Hôm nay, tôi đã phải thay thế cuộc gọi nhấp với gửi vì nhấp không chờ đợi nữa để tải trang, tôi chắc chắn rằng nhấp chuột đã hoạt động chính xác. Nó phải là một cái gì đó đã được thay đổi gần đây, nhưng tôi không thể chứng minh điều đó. Như mọi khi với selen nếu mọi thứ đang hoạt động, nó không có nghĩa là chúng được thực hiện một cách chính xác. –

7

Tôi là một fan hâm mộ lớn của submit() nhưng không được nữa.

Trong trang web mà tôi kiểm tra, tôi nhập tên người dùng và mật khẩu và nhấp Đăng nhập. Khi tôi gọi usernametextbox.submit(), hộp văn bản mật khẩu sẽ bị xóa (trở nên trống) và đăng nhập không bị lỗi.

Sau khi phá vỡ đầu của tôi đôi khi, khi tôi thay thế usernametextbox.submit() và thay thế bằng loginbutton.click(), nó hoạt động như một phép thuật.

+0

Đã xác nhận. Đã có một vấn đề với 'submit()' trên nút gửi, nhưng nó sẽ không mang lại thông qua thuộc tính value của nút. bằng cách sử dụng 'click()' trên nút làm việc như một nét duyên dáng. – Manfred

+0

Cảm ơn bạn, cảm ơn bạn, cảm ơn bạn. Bạn không chắc chắn tại sao gửi không hoạt động. – ndhar

+0

Cùng một vấn đề ở đây. Mã của tôi đã trở nên phức tạp, bởi vì bây giờ tôi phải đợi trang tải. – neves

1

Không submit() cũng không click() là đủ tốt. Tuy nhiên, nó hoạt động tốt nếu bạn làm theo nó với một phím ENTER:

search_form = driver.find_element_by_id(elem_id) 
search_form.send_keys(search_string) 
search_form.click() 
from selenium.webdriver.common.keys import Keys 
search_form.send_keys(Keys.ENTER) 

Thử nghiệm trên máy Mac 10.11, python 2.7.9, Selenium 2.53.5. Điều này chạy song song, có nghĩa là trả về sau khi nhập phím ENTER, không chờ trang tải.

1

submit() phương pháp có thể được sử dụng để nhấp vào nút có trong biểu mẫu và thuộc tính Loại phải là "gửi".

click() phương pháp được sử dụng để nhấp vào nút trong trang web.

Đúng nếu tôi sai.

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