Cześć! Widzę, że masz kurs Selenium w Javie ale czy planujesz coś podobnego na C#? W firmie, w której pracuję używamy właśnie tego języka i zaczęłam/zacząłem się go uczyć, a ja nie wiem czy różnice są duże i czy sobie poradzę przerabiając kurs w Javie.
Od tego się z reguły zaczyna. Podobnych pytań dostaję relatywnie sporo, pewnie dlatego, że nie kryję się z tym, że w C# też pisałam. I również dlatego, że mimo iż C# nie jest tak popularny jak Java, to używa się go w wielu korporacjach – widzę to po ogłoszeniach o pracę. JetBrains wypuściło też raport, który wskazuje, że 15% osób, które odpowiedziały na pytanie o ich głównych język programowania, wskazało właśnie C# (Javę wskazało 34% osób). Trzeba naturalnie brać pod uwagę, że pytanie nie było kierowane tylko do testerów, ale daje to jakieś pojęcie o popularności tego języka.
Kurs Selenium w C# już dostępny!
Na moment pisania tego artykułu kurs Selenium w C# dopiero był w planach. Teraz jest już dostępny w większej części, a dokładny zakres sprawdzisz tutaj: kurs Selenium w C#
Ponieważ skakałam trochę pomiędzy Javą a C#, to mam jakieś pojęcie na temat różnic w pracy w tych dwóch językach programowania, w szczególności na temat różnic w użyciu Selenium. No właśnie, jak to jest z tymi różnicami w Selenium w obu tych językach? Czy jest ich wiele? Czy są istotne? I na koniec czy trudno się przestawić?
Poniższe porównanie będzie dotyczyło wersji 3.14 Selenium w C# i 3.141.59 w Javie. Nie wymienię tutaj na pewno wszystkich różnic, ale wskażę kilka, które mi się rzuciły w oko.
Spis treści
Konwencja nazewnicza
Pierwsza i zarazem dosyć trywialna różnica to konwencje nazewnicze w obu językach, które wpływają np. na to jak wyglądają nazwy metod w Selenium.
- Nazwy metod w C# piszemy z wielkiej litery, w przeciwieństwie do Javy, gdzie zaczynamy małą literą, np.:
//Java driver.findElement(lokator);
//C# driver.FindElement(lokator);
Typy parametrów
Ze względu na różne rozwiązania i dostępne biblioteki w obu językach programowania, poszczególne metody i konstruktory mogą się także nieznacznie różnić parametrami.
Przykładem może być tutaj jeden z konstruktorów klasy WebDriverWait przyjmujący dwa parametry. Pierwszym z nich jest driver, a drugim czas, przez jaki będziemy oczekiwać np. spełnienie warunku widoczności jakiegoś elementu przy użyciu obiektu tej klasy.
No i dla Javy wygląda to tak: WebDriverWait(WebDriver driver, long timeOutInSeconds). Drugi z parametrów jest typu long, więc wystarczy, że podamy tam liczbę.
//Java WebDriverWait wait = new WebDriverWait(driver, 5);
Natomiast w C# drugi parametr jest typu TimeSpan. TimeSpan z kolei to struktura – kolejny przykład czegoś, czego nie ma w Javie. W C# użycie konstruktora z podobnymi parametrami wyglądałoby jak poniżej:
//C# WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
Konstruktory
Zauważyłam również, że o ile metody mają z reguły swoje odpowiedniki w obu językach, to konstruktory nie zawsze. Przykładem jest tutaj wspomniana już klasa WebDriverWait, która ma trzy konstruktory (plus jeden oznaczony na „deprecated”) a C# dwa. Czy to poważna różnica? Raczej nie, zwłaszcza, gdy przyjrzymy się jakie parametry przyjmuje ten dodatkowy konstruktor.
Konstruktory w C# przyjmują poniższe parametry:
- WebDriverWait(IWebDriver, TimeSpan) – czyli drivera oraz czas, przez jaki będziemy czekać,
- WebDriverWait(IClock, IWebDriver, TimeSpan, TimeSpan) – tutaj dodatkowo (ostatni parametr) mamy jeszcze interwał czasu co jaki będzie sprawdzany np. jakiś warunek oraz obiekt klasy implementującej interfejs IClock używany do sprawdzenia, czy dany czas już minął (poprzednia metoda używa domyślnie obiektu klasy SystemClock()).
Konstruktory w Javie natomiast prezentują się następująco:
- WebDriverWait(WebDriver driver, long timeOutInSeconds) – to już znamy, odpowiednik pierwszego konstruktora w C#,
- WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis) – tutaj jako ostatni parametr dodajemy jeszcze interwał czasu, co jaki będzie np. sprawdzany jakiś warunek,
- WebDriverWait(WebDriver driver, java.time.Clock clock, Sleeper sleeper, long timeOutInSeconds, long sleepTimeOut) – dodajemy jeszcze zegar i obiekt typu Sleeper, który jest mechanizmem czekającym (to tutaj leży nasz znienawidzony Thread.sleep).
Z mojego punktu widzenia takie różnice nie są super istotne – z reguły nie będziemy potrzebować niczego poza pierwszym konstruktorem. A ten ostatni w Javie, to już w ogóle jest do zadań specjalnych. Jeżeli jest tutaj ktoś, kto go kiedyś użył – odezwij się proszę do mnie przez formularz kontaktowy, bo mnie ciekawość zżera jakie może być realne użycie tego wygibasa.
Expected Conditions
ExpectedConditions to klasa, która zawiera zestaw gotowych warunków, na które możemy sobie poczekać używając obiektu klasy WebDriverWait. Dzięki statycznym metodom, które znajdują się w tej klasie możemy na przykład poczekać aż element o podanym lokatorze będzie klikalny zanim w niego klikniemy:
//Java WebDriverWait wait = new WebDriverWait(driver, 5); wait.until(ExpectedConditions.elementToBeClickable(lokator));
Fajne, nie? Może i fajne, ale tylko w Javie – ExpectedConditions z C# zostało wycięte.
Cóż nam pozostaje wobec tego? Własna implementacja albo użycie paczki DotNetSeleniumExtras.WaitHelpers, która zawiera ExpectedConditions wykopane z Selenium. Nie umiem jednak powiedzieć w jakim stanie (chociaż data podana na stronie wskazuje, że nie było aktualizowane od ponad roku więc jednak skłaniam się ku własnej implementacji).
Page Factory
Page Factory to wbudowany w Selenium Page Object Model. O samym Page Factory można by dużo napisać, więc tylko odeślę do Selenium Wiki i Guru99.
Natomiast sytuacja jest taka sama jak w przypadku Expected Conditions – można używać w Javie, ale w C# już tego nie ma. Albo sobie użyjecie DotNetSeleniumExtras.PageObjects (nieaktualizowane od ponad roku) albo zaimplementujecie POM bez użycia Page Factory.
W moim kursie właśnie w taki sposób zaczynamy budować framework w oparciu o Page Object Model – bez użycia Page Factory (mimo, że to Java). Z Page Factory też będzie, ale uważam, że warto pokazać obie możliwości.
A podobieństwa?
Podobieństw w Selenium w Javie i C# jest moim zdaniem zdecydowanie więcej. Przeważająca większość metod ma swoje odpowiedniki w drugim języku i metody te robią w zasadzie to samo (czasami na innych typach parametrów albo w trochę inny sposób, ale efekt jest podobny).
Rzeczywiście, nie wszystko co dostępne w Javie (Page Factory i Expected Conditions) jest możliwe do użycia w C#, ale w drugą stronę jest już znacznie prościej.
Java i C# są do siebie w gruncie rzeczy bardzo podobne – przynajmniej na poziomie, na jakim nam jako testerom automatyzującym, są te języki potrzebne. Ja robiłam przeskok z Javy na C#, a potem z powrotem i muszę powiedzieć, że podstawowe koncepty i zasady są w zasadzie takie same. C# w stosunku do Javy wydaje się mieć trochę więcej „narzędzi” (jak na przykład struktury czy właściwości) ale znając już Javę można je sobie niejako przetłumaczyć na coś podobnego w Javie.
To co teraz? Brać co jest?
To zależy.
Pytanie z początku tego wpisu, to pytanie od ludków dłubiących w C#, którym chodzi po głowie zapisanie się na Testelce na kurs w Javie. I ja to widzę tak:
- To, czy sobie poradzisz z Selenium w Javie znając C# zależy od tego na jakim poziomie znasz C#. Powienieneś lub powinnaś czuć się w nim pewnie.
- To czy wyciągniesz coś z kursu w Javie zależy też od Twojej otwartości na nowy ekosystem (inne IDE, inny sposób na podpinanie bibliotek, inne frameworki do testów jednostkowych) i autentycznej potrzeby rozwoju.
- Takie rozwiązanie może być dla Ciebie jeżeli jesteś gotowy lub gotowa na to, że w takim wypadku sam kurs to nie wszystko i będzie trochę googlania, żeby przełożyć niektóre rzeczy na C#, bo nie zobaczysz przykładów z tego języka.
No łatwo nie będzie. Jeżeli więc nie chcesz sobie za bardzo utrudniać i nie myślisz ciepło o Javie jako o języku, z którym być może będziesz mieć kiedyś coś wspólnego zawodowo, zapisz się na listę chętnych na kurs w C# (kurs już dostępny!). W ten sposób będę mogła Cię poinformować o postępach projektu, jakim jest stworzenie takiego kursu.
Jeżeli jednak nie masz nic przeciwko Javie i nie zakładasz, że nigdy przenigdy nic w tym języku nie nadłubiesz, to możesz się zapisać od razu tutaj.