Các chiến lược định vị trong Selenium Python là các phương thức được sử dụng để định vị các phần tử từ trang và thực hiện một thao tác trên cùng một trang. Mô-đun Python của Selenium được xây dựng để thực hiện kiểm tra tự động với Python. Các ràng buộc Selenium Python cung cấp một API đơn giản để viết các bài kiểm tra chức năng/chấp nhận bằng cách sử dụng Selenium WebDriver. Sau khi một người đã cài đặt Selenium và kiểm tra – Điều hướng các liên kết bằng phương thức get, một người có thể muốn chơi nhiều hơn với Selenium Python. Sau khi mở một trang bằng selen chẳng hạn như geeksforgeeks, người dùng có thể muốn tự động nhấp vào một số nút hoặc tự động điền vào biểu mẫu hoặc bất kỳ tác vụ tự động nào như vậy. Bài viết này xoay quanh Định vị các phần tử đơn lẻ trong Selenium Python
Chiến lược định vị để xác định vị trí các yếu tố đầu tiên duy nhất
Ghi chú. find_element_by_*… không được dùng nữa và do đó, Theo lớp hiện được sử dụng với find_element. Để biết thêm chi tiết. truy cập vào đây
Selenium Python tuân theo các chiến lược định vị khác nhau cho các phần tử. Để định vị các phần tử, bạn phải nhập By
from selenium.webdriver.common.by import By
Người ta có thể xác định vị trí một phần tử theo 8 cách khác nhau. Đây là danh sách các chiến lược định vị cho Selenium trong python –
LocatorsDescriptionPhần tử đầu tiên có giá trị thuộc tính id khớp với vị trí sẽ được trả về. Phần tử đầu tiên có giá trị thuộc tính tên khớp với vị trí sẽ được trả về. Phần tử đầu tiên có cú pháp xpath khớp với vị trí sẽ được trả về. Phần tử đầu tiên có giá trị văn bản liên kết khớp với vị trí sẽ được trả về. Phần tử đầu tiên có giá trị văn bản liên kết một phần khớp với vị trí sẽ được trả về. Phần tử đầu tiên có tên thẻ đã cho sẽ được trả về. phần tử đầu tiên có tên thuộc tính lớp phù hợp sẽ được trả về. Phần tử đầu tiên có bộ chọn CSS phù hợp sẽ được trả vềQua. TÔI
Với chiến lược này, phần tử đầu tiên có bộ chọn CSS phù hợp sẽ được trả về. Nếu không có phần tử nào có bộ chọn CSS phù hợp, NoSuchElementException sẽ xuất hiện.
Bài viết này dành cho bất kỳ ai đang sử dụng Selenium hoặc Endtest và muốn biết cách tốt nhất để tìm các phần tử
Chìa khóa ở đây là tìm bộ định vị ổn định và đáng tin cậy nhất cho từng phần tử
Hãy nhớ rằng việc yêu cầu Selenium xác định vị trí một phần tử cũng giống như nói cho ai đó ở ngoài thị trấn cách tìm một quán cà phê nào đó trong thành phố của bạn
Chúng tôi sẽ sử dụng trang Đăng ký Github làm ví dụ
Tôi cũng sẽ thực hiện một số so sánh giữa Selenium và Endtest
Ngay cả khi bạn đang sử dụng Tiện ích mở rộng Chrome cuối cùng của chúng tôi để định vị các thành phần của mình, bạn vẫn có thể gặp phải các tình huống cần tìm nạp công cụ định vị
Chúng tôi sẽ sử dụng các loại công cụ định vị khác nhau để tìm đầu vào Tên người dùng
- Tìm phần tử theo ID
- Tìm phần tử theo tên
- Tìm phần tử theo tên lớp
- Tìm phần tử bằng XPath
- Tìm phần tử bằng CSS Selector
- Tìm phần tử theo văn bản liên kết
- Tìm phần tử theo văn bản liên kết một phần
- Tìm phần tử theo tên thẻ
1] Tìm phần tử theo ID
Luôn là lựa chọn hàng đầu
Để lấy ID phần tử của bạn, bạn chỉ cần nhấp chuột phải vào phần tử của mình và nhấp vào tùy chọn Kiểm tra
Cấu trúc phần tử của bạn sẽ được đánh dấu trong bảng điều khiển
Có vẻ như phần tử của chúng tôi có ID sau
đăng nhập người dùng
Điều này có nghĩa là dòng mã của bạn sẽ trông như thế này
tên người dùng = trình điều khiển. find_element_by_id["user_login"]
Vì ID phải là duy nhất trên một trang nên đây là loại công cụ định vị đáng tin cậy nhất mà bạn có thể sử dụng
Nó giống như chỉ có một cửa hàng Starbucks trong thành phố của bạn và bảo bạn bè đến gặp bạn ở đó, họ không thể bỏ lỡ
2] Tìm phần tử theo tên
Cũng tốt như ID, nhưng bạn sẽ không gặp nó thường xuyên như mong đợi
Các phần tử từ biểu mẫu thường có thuộc tính Tên
Chúng ta có thể dễ dàng thấy rằng phần tử của chúng ta có Tên sau
đăng nhập người dùng]
tên người dùng = trình điều khiển. find_element_by_name["người dùng[đăng nhập]"]
3] Tìm phần tử theo tên lớp
Không đáng tin cậy lắm, vì Tên lớp thường được chia sẻ bởi nhiều phần tử
Chúng ta có thể dễ dàng thấy rằng phần tử của chúng ta có Tên lớp sau
điều khiển biểu mẫu
Và nếu chúng ta xem xét kỹ hơn phần còn lại của các đầu vào từ biểu mẫu đó, chúng ta sẽ thấy rằng tất cả chúng đều có Tên lớp điều khiển biểu mẫu
tên người dùng = trình điều khiển. find_element_by_class_name["form-control"]
Điều này có nghĩa là bạn sẽ không thể xác định vị trí đầu vào Tên người dùng đó bằng loại bộ định vị Tên lớp, vì Selenium sẽ gây ra lỗi
Endtest có cách tiếp cận thanh lịch hơn ở đây so với Selenium. Nếu bạn cung cấp Tên lớp đó, nó sẽ chỉ cảnh báo cho bạn biết có bao nhiêu phần tử được tìm thấy với Tên lớp đó và phần tử đầu tiên sẽ được sử dụng
Nếu Starbucks có Class Name, có lẽ nó sẽ là quán cà phê. Nếu bạn nói với bạn của bạn Gặp tôi ở quán cà phê đó, họ có thể không biết bạn đang nói về quán nào
Lỗi phổ biến nhất của người mới bắt đầu là trích xuất tất cả Tên lớp thay vì chỉ một
Hãy xem xét yếu tố này
Người dùng mới làm quen có thể nói rằng phần tử có Tên lớp sau
HeaderMenu-link d-inline-block đường viền không gạch chân viền-xám-tối
Nhưng nó thực sự có 5 tên lớp khác nhau
HeaderMenu-link d-inline-block đường viền không gạch chân viền-xám-tối
Đúng vậy, Tên lớp được phân tách bằng dấu cách
Selenium không có xác thực cho điều đó, nhưng Endtest thì có
4] Tìm phần tử bằng XPath
Đơn giản là bạn không thể tránh khỏi việc phải sử dụng XPath cho ít nhất một số phần tử. Nó không tệ như họ nói
Một XPath giống như một tuyến đường. Có rất nhiều con đường mà bạn của bạn có thể đi để đến quán Starbucks đó
Thông thường, một XPath trông giống như thế này
/html/body/div[4]/main/div/div/div[1]/p
Cách nhanh nhất để lấy XPath là từ bảng điều khiển Chrome
Trong trường hợp này, chúng ta có XPath sau
//*[@id="user_login"]
Nếu bạn có ID ổn định, bạn không nên bận tâm sử dụng XPath
Và nếu bạn không có ID ổn định, XPath mà chúng tôi nhận được không đáng tin cậy
Có rất nhiều ứng dụng web đang sử dụng ID động cho một số phần tử
Một phần tử có ID động giống như một quán cà phê đang đổi tên hàng ngày
Bạn đã biết quán cà phê có tên là iCoffee ngày hôm qua, nhưng bạn không biết hôm nay nó sẽ có tên là gì
Nói với bạn của bạn để gặp bạn tại iCoffee sẽ gây nhầm lẫn
Đó là lúc chúng ta cần viết XPath của riêng mình
Tìm hiểu các thuộc tính và đặc điểm ổn định của phần tử đó là gì
Quay trở lại ví dụ với quán cà phê có tên khác
Một cái gì đó mà không thay đổi về nó là gì?
Có lẽ vị trí và thực tế rằng đó là một quán cà phê
Điều này có nghĩa là bạn có thể nói với bạn của mình từ ngoài thành phố đến gặp bạn tại quán cà phê từ Trung tâm mua sắm phía Tây
Hãy xem xét phần tử của chúng ta và lấy XPath của phần tử gốc của nó
Đây là XPath mà chúng tôi nhận được cho cha mẹ của nó
//*[@id="signup-form"]/auto-check[1]/dl/dd
Đây thực tế là địa chỉ của Trung tâm mua sắm phía Tây trong ví dụ của chúng tôi
Bây giờ tất cả những gì chúng ta phải làm là thêm một số chi tiết vào cuối
Phần tử Tên người dùng của chúng tôi là một đầu vào và nó có Tên lớp kiểm soát biểu mẫu
Điều này có nghĩa là chúng ta cần nối thêm phần sau vào cha mẹ
/input[@class="form-control"]
Và phần đó dịch sang. Tìm kiếm cha mẹ đó để tìm đầu vào có Tên lớp kiểm soát biểu mẫu
Và XPath cuối cùng cho phần tử Username của chúng ta sẽ như thế này
//*[@id="signup-form"]/auto-check[1]/dl/dd/input[@class="form-control"]
Luôn xác minh XPath của bạn trong bảng điều khiển Chrome bằng cách nhấn Ctrl + F và tìm kiếm nó, bạn sẽ thấy phần tử của mình được đánh dấu như thế này
Viết XPath của riêng bạn không quá đáng sợ. Bạn sẽ gặp các tình huống trong đó phần tử của bạn có thể không có ID, nhưng nó sẽ có một thuộc tính đáng tin cậy nhất định khiến nó trở nên độc nhất
Trong trường hợp đó, XPath của bạn sẽ trông như thế này
//*[@attribute = "attribute_value"]
Bạn cũng có thể viết XPath định vị phần tử bằng cách chỉ sử dụng một phần giá trị của thuộc tính
//*[chứa[@attribute, "part_of_attribute_value"]]
Ví dụ: phần tử Tên người dùng của chúng tôi có các thuộc tính sau
aria-descriptedby="description_2822cb3d798c" name="user[login]" autocapitalize="off"AFAF="autofocus" required="required" class="form-control" type="text" id="user_login" autocomplete="
Nếu chúng ta muốn sử dụng thuộc tính aria-descriptedby, đây sẽ là XPath
//*[@aria-descriptedby = "description_2822cb3d798c"]
Nếu bạn đang sử dụng Endtest thay vì Selenium, trình ghi của họ sẽ biết cách tự động trích xuất các XPath tùy chỉnh này
5] Tìm phần tử bằng CSS Selector
Loại bộ định vị CSS Selector tương tự như XPath
Một số người thực sự cho rằng nó nhanh hơn
Thông thường, Bộ chọn CSS trông như thế này
cơ thể> div. ứng dụng chính> chính> div> div
Và chúng tôi giải nén nó theo cách tương tự
Trong trường hợp này, chúng tôi có Bộ chọn CSS sau
#đăng nhập người dùng
Nếu bạn quen thuộc với CSS, bạn sẽ biết rằng # là viết tắt của ID
Điểm tương đồng với XPath không dừng lại ở đây
Nếu bạn có ID ổn định, bạn không nên bận tâm sử dụng CSS Selector
Và nếu bạn không có ID ổn định, Bộ chọn CSS mà chúng tôi nhận được không đáng tin cậy
Giải pháp?
Để viết Bộ chọn CSS tùy chỉnh của riêng chúng tôi
Hãy bắt đầu bằng cách trích xuất Bộ chọn CSS cho phần tử gốc của phần tử Tên người dùng
Đây là những gì chúng tôi nhận được
#signup-form > tự động kiểm tra. con thứ n[4] > dl > dd
Bây giờ, giống như chúng ta đã làm với XPath, chúng ta cần thêm một số chi tiết ở cuối
Trong trường hợp bạn quên, phần tử Tên người dùng của chúng tôi là một đầu vào và nó có Tên lớp điều khiển biểu mẫu
Điều này có nghĩa là chúng ta cần nối thêm phần sau vào cha mẹ
> đầu vào. điều khiển biểu mẫu
Và phần đó dịch sang
Tìm kiếm cha mẹ đó để tìm đầu vào có Tên lớp kiểm soát biểu mẫu
Nếu bạn quen thuộc với CSS, dấu chấm là viết tắt của Tên lớp
Và Bộ chọn CSS cuối cùng cho phần tử Tên người dùng của chúng ta sẽ trông như thế này
#signup-form > tự động kiểm tra. con thứ n[4] > dl > dd > đầu vào. điều khiển biểu mẫu
Không bắt buộc phải thêm cả loại phần tử và Tên lớp
Bạn chỉ có thể sử dụng một trong số họ
#signup-form > tự động kiểm tra. con thứ n[4] > dl > dd > đầu vào
#signup-form > tự động kiểm tra. con thứ n[4] > dl > dd >. điều khiển biểu mẫu
Một lần nữa, nếu bạn đang sử dụng Endtest thay vì Selenium, trình ghi của họ sẽ biết cách tự động trích xuất các Bộ chọn CSS tùy chỉnh này
6] Tìm phần tử theo văn bản liên kết
Loại công cụ định vị văn bản liên kết chỉ hoạt động đối với các liên kết
Phần tử của bạn là một Liên kết nếu nó có định dạng sau
A là viết tắt của Anchor
Vì phần tử Tên người dùng của chúng tôi là một đầu vào và không phải là một liên kết, nên chúng tôi sẽ không thể xác định vị trí của nó bằng cách sử dụng Văn bản liên kết
Điều đáng ghi nhớ là Văn bản liên kết chỉ là văn bản giữa các thẻ
Trong trường hợp liên kết từ ảnh chụp màn hình, Văn bản liên kết là Doanh nghiệp
Mã Selenium của chúng tôi sẽ trông như thế này
Enterprise_link = trình điều khiển. find_element_by_link_text["Doanh nghiệp"]
7] Tìm phần tử bằng văn bản liên kết một phần
Như tên cho thấy, nó giống hệt như Văn bản liên kết, nhưng với sự khác biệt là bạn chỉ cần thêm một phần của Văn bản liên kết
Và đây sẽ là mã Selenium của chúng ta
Enterprise_link = trình điều khiển. find_element_by_partial_link_text["Enterp"]
8] Tìm phần tử theo tên thẻ
Như chúng ta đã thấy từ các ví dụ trước, một phần tử luôn có một thẻ
Bạn có thể sử dụng loại công cụ định vị Tên thẻ nếu đó là đặc điểm duy nhất của phần tử mà bạn có thể lấy
Thực tế mà nói, tôi không nghĩ bạn sẽ sử dụng cái này
Endtest có thêm một loại định vị là Text Inside, tương tự như Partial Link Text, nhưng nó dùng được cho mọi loại phần tử
Ngay cả khi bộ định vị của bạn đáng tin cậy, bạn sẽ gặp phải các tình huống trong đó ứng dụng web của bạn trải qua quá trình sửa đổi và bạn sẽ mất thời gian để giữ cho các bài kiểm tra của mình đồng bộ với các ứng dụng web của bạn