To jest powszechny problem. Chciałbym zwrócić uwagę na:
Jak nazywasz elementy
Użyj identyfikatora css lub klasy, aby zidentyfikować elementy. Preferuj używanie identyfikatora CSS, gdy obiekt jest unikalny. Zastanów się, jakiej ramy używasz, na przykład w Ruby on Rails name
atrybut ten jest przypisywany automatycznie i może (nie intuicyjnie) być lepszy niż użycie css id lub klasy
Jak rozpoznajesz elementy.
Unikaj identyfikatorów pozycyjnych, takich jak table/tr/td/td
na przykład formy td[id="main_vehicle"
lub td[class='alternates']
. W razie potrzeby rozważ użycie atrybutów danych. Jeszcze lepiej staraj się unikać znaczników układu, takich jak w <td>
ogóle, więc w powyższym przypadku możesz dodać zakres i użyć go, np. <span id="main_vehicle">
Lub selektora symboli wieloznacznych, takiego jak *[id="main_vehicle"]
gdzie *
może być teraz div, span, td itp.
Korzystanie z atrybutów danych specyficznych dla testu które są używane tylko do qa i testowania.
Unikaj niepotrzebnych kwalifikacji do elementów. Możesz znaleźć się przy użyciu następujących czynności:
body.main div#vehicles > form#vehicle input#primary_vehicle_name
Wymaga to jednak, aby pole wejściowe pozostało w formie z dokładnym identyfikatorem pojazdu i na stronie z treścią, która ma klasę main i div z identyfikatorem pojazdów, które mają bezpośrednie potomek formularza o identyfikatorze pojazd. Wszelkie zmiany w dowolnej z tych struktur i test są przerywane. W takim przypadku możesz to znaleźć
input#primary_vehicle_name
wystarczy, aby jednoznacznie zidentyfikować element.
Unikaj testów, które odnoszą się do widocznego tekstu. Tekst na stronie wyświetlany użytkownikowi zwykle zmienia się w czasie, gdy witryna jest utrzymywana i aktualizowana, więc używaj identyfikatorów, takich jak identyfikator css i klasa css lub atrybuty danych. Elementy takie jak form
, input
i select
stosowane w formach są również dobre części elementów identyfikujących, zwykle w połączeniu z identyfikatorem lub klasy, np li.vehicle
albo input#first-vehicle
Można również dodawać własne identyfikatory, np<div data-vehicle='dodge'>
. W ten sposób można uniknąć używania identyfikatorów elementów lub klas, które mogą zostać zmienione przez programistów i projektantów. Z czasem odkryłem, że lepiej jest po prostu współpracować z programistami i projektantami i dojść do porozumienia co do nazw i zakresów. To jest trudne.
Jak utrzymywane są stałe dane.
Podobnie jak w przypadku identyfikowania rzeczywistych elementów, staraj się unikać wbudowanych na stałe selektorów identyfikujących wartości na korzyść obiektów strony - małych fragmentów tekstu, które są przechowywane w zmiennych lub metodach, a zatem mogą być ponownie użyte, a także przechowywane centralnie. Przykłady zmiennych javascript zgodnie z tym wzorem dla wartości zakodowanych na stałe:
storedVars["eqv_auto_year"] = "2015";
storedVars["eqv_auto_make_1"] = "ALFA ROMEO";
storedVars["eqv_auto_make_2"] = "HONDA";`
Więcej na temat obiektów stron na selenium wiki i dokumentach selenium
Komunikacja z programistami.
Niezależnie od technicznego podejścia w zakresie „programiści wprowadzają zmiany i łamią automatyzację kontroli jakości”, to jest problem z przepływem pracy. Musisz upewnić się, że: każdy jest jednym zespołem; programista przeprowadza te same zintegrowane testy; standardy są uzgadniane i przestrzegane przez obie grupy; definicja gotowego obejmuje uruchomienie i ewentualnie aktualizację testów interfejsu użytkownika; programiści i testerzy łączą plany testowe i oboje uczestniczą w pielęgnacji biletów (jeśli wykonują Agile) i rozmawiają o testowaniu interfejsu użytkownika w ramach pielęgnacji. Powinieneś upewnić się, że wszelkie podejście i strategia używane do nazewnictwa są skoordynowane z twórcami aplikacji. Jeśli nie znajdziesz się na tej samej stronie, polubisz nazewnictwo obiektów. Kilka przykładów metod obiektów strony, które niedawno stworzyłem dla projektu 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
Oto te same obiekty stron, co zmienne 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]']";