Znak ucieczki, czyli co, gdy w stringu potrzebuję cudzysłowu

W ramach testów automatycznych w Selenium często używamy ciągów znaków, które potocznie przyjęło się nazywać stringami (od nazwy klasy reprezentującej taki typ danych). Stringów używamy np., gdy porównujemy jakieś wartości w asercjach, żeby sprawdzić, czy dany warunek został spełniony. Używamy ich także, np. w lokatorach jako parametr wybranej metody w zależności od tego, jakim mechanizmem chcemy wyszukać element na stronie.

>> Ten wpis jest inspirowany pytaniami subskrybentów kursu Selenium. Chcesz dołączyć do kursu i mieć możliwość zadawania pytań? Dołącz tutaj!

Jak tworzymy stringi

Ciągi znaków, zarówno w Javie jak i w C# zapisujemy w cudzysłowie, czyli np. „Lody truskawkowe”. Jeżeli chcemy stworzyć nowy ciąg znaków i od razu przechować go w jakiejś zmiennej możemy to zrobić poniższy sposób.

//Java
String lody = "Lody truskawkowe";
//C#
string lody = "Lody truskawkowe";

Czyli znak jaki ogranicza nam stringa, czyli mówi gdzie jest jego początek, a gdzie koniec, to cudzysłów. A teraz wyobraź sobie, że piszesz prosty test, w którym dodajesz do koszyka wybrany produkt i chcesz sprawdzić czy wyświetli się komunikat: „Plecak turystyczny 40 L” został dodany do koszyka. Żeby to zrobić pobierasz element z tym komunikatem i pobierasz potem z niego tekst. Następnie porównujesz go z oczekiwanym. No dobrze, tylko wiemy już, że cudzysłów jest interpretowany jako początek i koniec stringa, więc pewnie się domyślasz, że to, co widzisz poniżej nie zadziała poprawnie.

//Java
String komunikat = ""Plecak turystyczny 40 L" został dodany do koszyka";
//C#
string komunikat = ""Plecak turystyczny 40 L" został dodany do koszyka";

Przy próbie uruchomienia testu zawierającego coś takiego dostaniemy błędy. Nic dziwnego – cudzysłów jest interpretowany jako początek albo koniec stringa, więc naszego stringa zamyka zaraz na początku drugim cudzysłowem. No to co robić jak potrzebujemy do szczęścia tego cudzysłowu w środku?

Znak ucieczki

Znak ucieczki nazywany też (według Wikipedii) znakiem modyfikacji, to coś co pozwala zmienić domyślną interpretację znaku, w tym wypadku cudzysłowu. Zarówno w Javie i w C# jest to ten sam znak, a mianowicie „\” (backslash). Jedyne co z tym backslashem musimy zrobić, to umieścić go w stringu przed każdym znakiem, który chcemy użyć jako część tego stringa. Czyli na przykładzie komunikatu z plecakiem będzie to wyglądać jak poniżej.

//Java 
String komunikat = "\"Plecak turystyczny 40 L\" został dodany do koszyka"; 
//C# 
string komunikat = "\"Plecak turystyczny 40 L\" został dodany do koszyka";

W ten sposób drugi i trzeci cudzysłów traktowany jest jak część stringa i nie „wyskakujemy” ze stringa tam gdzie nie chcemy.

Do czego jeszcze znak ucieczki

Znak ucieczki ma trochę więcej zastosowań niż tylko traktowanie cudzysłowu jak części stringa. Można za jego pomocą wprowadzić np. backslash do tekstu. W tym celu backslash musimy poprzedzić… bacskslashem właśnie, czyli znakiem ucieczki. 

//E:\dev\test.txt
//Java
String ścieżka = "E:\\dev\\test.txt";
//C#
string ścieżka = "E:\\dev\\test.txt";

Gdy natomiast potrzebujemy użyć stringa, który składa się kilku linii, używamy znaku ucieczki, czyli „\” oraz litery „n”, czyli „\n”. W ten sposób litera „n” nie jest interpretowana domyślne, a właśnie jako znak nowej linii.

//Dziękujemy!
//Twoje zgłoszenie zostało przyjęte
//Java
String zgłoszenie = "Dziękujemy!\nTwoje zgłoszenie zostało przyjęte.";
//C#
String zgłoszenie = "Dziękujemy!\nTwoje zgłoszenie zostało przyjęte.";

Więcej możliwości zarówno w Javie jak i w C# znajdziesz w linkach.

Uwaga na koniec

Jeżeli jesteś tutaj, bo budujesz selektor i chcesz wyszukać po tekście jakiś element, który zawiera cudzysłów, to zastanów się czy nie można inaczej. Wyszukiwanie elementów na stronie po tekście jaki zawierają (również po linku) to nie nienajlepszy pomysł. Tekst na stronie może zostać zmieniony nawet bez developmentu, np. przez ludzi pracujących w dziale marketingu. Po drugie w przypadku, gdy testujesz kilka wersji językowych, potrzebujesz kilka różnych lokatorów dla tego samego elementu ale w różnych językach. 

Linki

Pełna lista dostępnych kombinacji w Javie: https://docs.oracle.com/javase/tutorial/java/data/characters.html

I w C#: https://docs.microsoft.com/en-us/cpp/c-language/escape-sequences?view=vs-2019

Dodaj komentarz: