Đây là một vấn đề phổ biến. Tôi sẽ chú ý đến:
Cách bạn đặt tên các yếu tố
Sử dụng css id hoặc class để xác định các thành phần. Ưu tiên sử dụng CSS ID khi đối tượng là duy nhất. Hãy xem xét khung công tác bạn đang sử dụng, ví dụ với Ruby on Rails, name
thuộc tính được gán tự động và có thể (không trực quan) tốt hơn so với sử dụng id hoặc lớp css
Làm thế nào bạn xác định các yếu tố.
Tránh các định danh vị trí như table/tr/td/td
ủng hộ các hình thức như td[id="main_vehicle"
hoặc td[class='alternates']
. Cân nhắc sử dụng các thuộc tính dữ liệu khi thích hợp. Thậm chí tốt hơn nên tránh các thẻ bố cục như <td>
hoàn toàn để ở trên, bạn có thể thêm một khoảng và sử dụng nó, ví dụ <span id="main_vehicle">
hoặc một bộ chọn ký tự đại diện, chẳng hạn như *[id="main_vehicle"]
nơi *
bây giờ có thể là div, span, td, v.v.
Sử dụng thử nghiệm các thuộc tính dữ liệu cụ thể chỉ được sử dụng cho qa và thử nghiệm.
Tránh trình độ không cần thiết cho các yếu tố. Bạn có thể thấy mình sử dụng như sau:
body.main div#vehicles > form#vehicle input#primary_vehicle_name
Tuy nhiên, điều này đòi hỏi trường đầu vào phải duy trì ở dạng có id chính xác của xe và trên trang có thân xe có lớp chính và div có id xe có dạng con ngay lập tức có id xe cộ. Bất kỳ thay đổi đối với bất kỳ cấu trúc đó và phá vỡ thử nghiệm. Trong trường hợp này bạn có thể thấy rằng
input#primary_vehicle_name
là đủ để xác định duy nhất các yếu tố.
Tránh các bài kiểm tra đề cập đến văn bản hiển thị. Văn bản trên trang được hiển thị cho người dùng thường thay đổi theo thời gian khi trang web được duy trì và cập nhật, vì vậy hãy sử dụng các định danh như css id và lớp css hoặc thuộc tính dữ liệu. Các yếu tố như form
, input
và select
được sử dụng trong mẫu đơn này cũng là bộ phận không tốt của các yếu tố xác định, thường kết hợp với id hoặc class, ví dụ li.vehicle
hoặc input#first-vehicle
Bạn cũng có thể thêm định danh riêng của bạn, ví dụ <div data-vehicle='dodge'>
. Bằng cách này, bạn có thể tránh sử dụng ID phần tử hoặc các lớp, có khả năng sẽ bị thay đổi bởi các nhà phát triển và nhà thiết kế. Theo thời gian, tôi thực sự thấy rằng tốt hơn là chỉ làm việc với các nhà phát triển và nhà thiết kế và thỏa thuận về tên và phạm vi. Thật khó
Làm thế nào dữ liệu cố định được duy trì.
Tương tự như xác định các yếu tố thực tế, cố gắng tránh các bộ chọn mã hóa cứng nội tuyến xác định các giá trị có lợi cho các đối tượng trang - các đoạn văn bản nhỏ được giữ trong các biến hoặc phương thức và do đó có thể được sử dụng lại và cũng được duy trì tập trung. Ví dụ về các biến javascript theo mẫu này cho các giá trị được mã hóa cứng:
storedVars["eqv_auto_year"] = "2015";
storedVars["eqv_auto_make_1"] = "ALFA ROMEO";
storedVars["eqv_auto_make_2"] = "HONDA";`
Thêm về các đối tượng trang tại tài liệu selenium wiki và selenium
Giao tiếp với các nhà phát triển.
Bất kể phương pháp kỹ thuật nào về 'nhà phát triển thực hiện thay đổi và phá vỡ tự động hóa QA' là vấn đề về quy trình làm việc. Bạn cần chắc chắn rằng: mọi người là một đội; nhà phát triển chạy các thử nghiệm tích hợp tương tự; các tiêu chuẩn được thống nhất và tuân theo bởi cả hai nhóm; định nghĩa thực hiện bao gồm chạy và có thể cập nhật các bài kiểm tra UI; các nhà phát triển và người thử nghiệm kết hợp với các kế hoạch kiểm tra và cả hai đều tham dự chải chuốt vé (nếu làm Agile) và nói về kiểm tra giao diện người dùng như một phần của việc chải chuốt. Bạn nên đảm bảo rằng bất kỳ cách tiếp cận và chiến lược nào bạn sử dụng để đặt tên đều được phối hợp với các nhà phát triển ứng dụng. Nếu bạn không vào cùng một trang, bạn sẽ thích xung đột với việc đặt tên đối tượng. Một số ví dụ về các phương thức đối tượng trang mà tôi đã tạo gần đây cho một dự án ruby:
def css_email_opt_in_true
'auto_policy[email_opt_in][value=1]'
end
def css_phone_opt_in
'*[name="auto_policy[phone_opt_in]"]'
end
def css_phone_opt_in_true
'input[name=phone_opt_in][value=true]'
end
def css_credit_rating
'auto_policy[credit_rating]'
end
Đây là các đối tượng trang giống như các biến javascript:
storedVars["css_email_opt_in"] = "css=*[name='auto_policy[email_opt_in]']";
storedVars["css_phone_opt_in"]="css=*[name='auto_policy[phone_opt_in]']";
storedVars["css_phone_opt_in_true"]="css=input[name='phone_opt_in'][value=true]";
storedVars["css_credit_rating"]="css=select[name='auto_policy[credit_rating]']";