2012-03-05 55 views
35

Tôi gặp sự cố - Tôi đang sử dụng trình điều khiển web selenium (firefox) để mở trang web, nhấp vào một vài liên kết, v.v. sau đó chụp ảnh màn hình.Python - Selenium WebDriver - Kiểm tra phần tử tồn tại

Tập lệnh của tôi chạy tốt từ CLI, nhưng khi chạy qua cronjob, nó sẽ không vượt qua kiểm tra find_element() đầu tiên. Tôi cần phải thêm một số gỡ lỗi, hoặc một cái gì đó để giúp tôi tìm ra lý do tại sao nó không thành công.

Về cơ bản, tôi phải nhấp vào liên kết 'đăng nhập' trước khi truy cập trang đăng nhập. Các cấu trúc của nguyên tố này là:

<a class="lnk" rel="nofollow" href="/login.jsp?destination=/secure/Dash.jspa">log in</a> 

Tôi đang sử dụng find_element Bằng phương pháp LINK_TEXT:

login = driver.find_element(By.LINK_TEXT, "log in").click() 

Tôi là một chút của một Python Noob, vì vậy tôi đang chiến đấu với ngôn ngữ một chút ..

A) Làm thế nào để kiểm tra xem liên kết có thực sự được chọn bởi python không? Tôi có nên sử dụng khối try/catch không?

B) Có cách nào tốt hơn/đáng tin cậy hơn để định vị phần tử DOM hơn LINK_TEXT không? Ví dụ. Trong JQuery, bạn có thể sử dụng một bộ chọn cụ thể hơn $ ('a.lnk: contains (log in)'). Do_something();


Tôi đã giải quyết được vấn đề chính và đó chỉ là vấn đề về ngón tay - Tôi đang gọi tập lệnh có thông số không chính xác - Lỗi đơn giản.

Tôi vẫn muốn một số gợi ý về cách kiểm tra xem một thành phần có tồn tại hay không. Ngoài ra, một ví dụ/giải thích về các hàm Waits ngầm/rõ ràng thay vì sử dụng một cuộc gọi crappy time.sleep().

Chúc mừng, ns

+0

Bạn cũng có thể tìm các thành phần theo định vị CSS hoặc xpath. Có xu hướng ít giòn hơn so với nội dung văn bản. –

+0

Tôi tin rằng cả hai - sử dụng nội dung văn bản và XPATH/CSS - là mong manh để thay đổi nhỏ trong thiết kế chứ không phải là logic ứng dụng. Cách tốt hơn là tìm phần tử bằng 'id',' class_name' hoặc 'name'. –

Trả lời

34

A) Có. Cách dễ nhất để kiểm tra xem phần tử có tồn tại hay không chỉ đơn giản là gọi find_element bên trong một số try/catch.

B) Vâng, tôi luôn cố gắng để xác định các yếu tố mà không sử dụng văn bản của họ đối với 2 lý do:

  1. văn bản có nhiều khả năng thay đổi và;
  2. nếu điều đó quan trọng đối với bạn, bạn sẽ không thể chạy thử nghiệm của mình dựa trên các bản dựng được bản địa hóa.

giải pháp hai:

  1. Bạn có thể dùng xpath để tìm một yếu tố cha mẹ hoặc tổ tiên có một ID hoặc một số định danh duy nhất khác và sau đó tìm thấy nó là con/hậu duệ phù hợp hoặc;
  2. bạn có thể yêu cầu ID hoặc tên hoặc một số số nhận dạng duy nhất khác cho chính liên kết đó.

Đối với việc theo dõi câu hỏi, sử dụng try/catch là cách bạn có thể cho biết nếu một yếu tố tồn tại hay không và ví dụ tốt về chờ đợi có thể được tìm thấy ở đây: http://seleniumhq.org/docs/04_webdriver_advanced.html

+0

Một cách sử dụng tôi có để tìm văn bản là xem có hiển thị thông báo flash thành công/không thành công hay không. Không chắc chắn nếu có một cách tốt hơn để làm điều đó? –

+0

Đó là lý do tuyệt vời để tránh lựa chọn bằng văn bản – kevlarr

56

một)

from selenium.common.exceptions import NoSuchElementException   
def check_exists_by_xpath(xpath): 
    try: 
     webdriver.find_element_by_xpath(xpath) 
    except NoSuchElementException: 
     return False 
    return True 

b) sử dụng xpath - đáng tin cậy nhất. Hơn nữa, bạn có thể lấy xpath làm chuẩn trong tất cả các tập lệnh và tạo các chức năng như đã đề cập ở trên để sử dụng phổ biến.

CẬP NHẬT: Tôi đã viết câu trả lời ban đầu hơn 4 năm trước và tại thời điểm đó tôi nghĩ xpath sẽ là lựa chọn tốt nhất. Bây giờ tôi khuyên bạn nên sử dụng các bộ chọn css css. Tôi vẫn khuyên bạn không nên trộn/sử dụng "theo id", "theo tên" và vv và sử dụng một phương pháp duy nhất để thay thế.

+0

Bạn cũng nên chuyển đối tượng: browser = webdriver.Firefox() vào chức năng tùy chỉnh của bạn – 8090PZ

+0

Nói chung, tôi hiếm khi gặp các trang html phù hợp với ý tưởng kết hợp đồng nhất. Có cách nào để làm việc xung quanh kết hợp của các phương pháp định vị trên các trang như vậy? –

+0

@KshitijSaraogi Không chắc chắn hoàn toàn hiểu câu hỏi của bạn. Nếu bạn đang ở đó là nó không thể chỉ có 'sels css' trong các bài kiểm tra webdriver của bạn - nó thực sự là khá tốt. Tôi đã làm điều đó trong 6 năm qua. –

22

Không có giải pháp nào được cung cấp dường như dễ dàng nhất đối với tôi, vì vậy tôi muốn thêm theo cách riêng của mình.

Về cơ bản, bạn nhận danh sách các phần tử thay vì chỉ phần tử và sau đó đếm kết quả; nếu nó bằng không, thì nó không tồn tại. Ví dụ:

if driver.find_elements_by_css_selector('#element'): 
    print "Element exists" 

Thông báo "s" trong find_elements_by_css_selector để đảm bảo nó có thể đếm được.

EDIT: Tôi đã kiểm tra len( của danh sách, nhưng gần đây tôi biết rằng một danh sách rỗng là falsey, vì vậy bạn không cần phải có được độ dài của danh sách ở tất cả, để lại cho mã thậm chí đơn giản hơn.

Ngoài ra, một câu trả lời khác nói rằng việc sử dụng xpath là đáng tin cậy hơn, điều này không đúng. Xem What is the difference between css-selector & Xpath? which is better(according to performance & for cross browser testing)?

+2

Phương thức này có nhanh hơn phương pháp xử lý ngoại lệ trên không? –

+1

@ GalBracha Câu hỏi hay, tôi giả sử nó có thể phụ thuộc vào phiên bản và nền tảng, vì vậy nếu chênh lệch tốc độ quan trọng đối với bạn ở đây, tôi khuyên bạn nên thử nghiệm trên nền tảng đích để có kết quả tốt nhất. Tuy nhiên, có một điểm cần được thực hiện ở đây về việc tối ưu hóa trước và khả năng đọc mã có thể quan trọng hơn so với cải thiện hiệu suất không thể bỏ qua trong trường hợp này –

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