Testy automatyczne selenium i python cz2. - ustawienie CORS

Jozdowska Edyta · 05 Styczeń 2020

1.SOP

Same Origin Policy (SOP) - czyli natywny mechanizm przeglądarki polegający na zabezpieczeniu wymiany danych przez aplikację (stronę) w obrębie tej samej i tylko tej samej domeny (origin - tego samego pochodzenia).

Cross-Origin Resource Sharing (CORS) jest mechanizmem umożliwiającym współdzielenie danych pomiędzy różnymi serwerami/aplikacjami/stronami, czyli między źródłami/biorcami o różnym pochodzeniu.

Przyjżyjmy się kilku adresom:

  • http://domena.com i http://domena.com/strona/1 - te dwa adresy mają to samo pochodzenie (wspólny protokół, host i port) :green_heart:
  • https://domena.com i http://domena.com - mają różne protokoły, a zarazem różne pochodzenie :x:
  • http://domena.com:4000 i http://domena.com - mają różne porty, a zarazem różne pochodzenie :x:
  • http://domena.com i http://subdomena.domena.com - mają różne hosty, a zarazem różne pochodzenie :x:

Dzięki CORS i odpowiedniemu ustawieniu serwera możemy dopuścić do określonych źródeł danych wskazanych w polityce CORS serwery/domeny i pozwolić im na komunikację. Czyli zamiast :x: byłoby :green_heart:. Tak to się odbywa na produkcji, a na developmencie?

Uruchamiając w odpowiedni sposób przeglądarkę lub uruchamiając odpowiedni dodatek do przeglądarki cały ten mechanizm (SOP/CORS) zostaje “pominięty”. Nie polegajmy więc jedynie na SOP i CORS jako zabezpieczeniu, ale to poza tematem.

Czemu o tym wspominam. Cóż mam trochę pomieszane instalacje i serwer apatche mam gdzie indziej, generowane strony np. z Jekyll’a mam gdzie indziej, a jakoś muszę łączyć ze sobą np. hosty na różnych portach http://localhost i http://localhost:4000. Oczywiście mogłabym ustawić wszystko w jednym miejscu, dostosować porty etc. Mogłabym, ale wiem, że nie muszę. Wyłączenie CORS :japanese_goblin: sprawia, że nie muszę w ogóle o tym myśleć. Ma to swoje plusy i minusy, nad którymi nie będę się pochylać.

2.Chrome bez SOP i CORS

Wpierw w jaki sposób można uruchomić przeglądarkę Chrome bez SOP i CORS. Okazuje się, że w bardzo prosty sposób.

  1. Uruchamiamy terminal.
  2. Sprawdzamy gdzie jesteśmy poprzez wpisanie
    1
    2
    3
    
    pwd # (PrintWorkingDirectory)
    
    # odpowiedź na terminalu np:  /home/nazwa użytkownika
    

    czyli wyświetl ścieżkę do obecnego (tu gdzie jest terminal) katalogu.

  3. Wpisujemy
    1
    
    mkdir tmp # (Make Directory)
    

    by utworzyć w miejscu gdzie jesteśmy folder o nazwie tmp. Możemy sprawdzić wpisując np ls -a | grep tmp. Jeśli wyświetli nam tmp katalog został utworzony. A po co ten katalog? Podczas uruchamiania przeglądarki Chrome z nieaktywnymi zabezpieczeniami wymagane jest wskazanie katalogu. I ten nowo utworzony katalog wskażemy w kolejnym kroku.

  4. Komenda służąca do uruchomienia z terminala Chrome to google-chrome. Aby uruchomić ją w trybie bez zabezpieczeń musimy użyć flagi - -disable-web-security i wskazać - -user-data-dir katalog na dane (ten co utworzyliśmy w kroku 3). Cała komenda wygląda następująco:
    1
    
    google-chrome --user-data-dir="~/tmp" --diable-web-security
    

Uruchomi nam się nowa instacja Chrome z uwagą, że

Użyto nieobsługiwanej flagi wiersza poleceń –disable-web-security. Ma to negatywny wpływ na stabilność i zabezpieczenia

OH MY GOSH :flushed: straszny komunikat. No cóż ten tryb jest przydatny :sunglasses:.

3.WebDriver bez CORS i SOP

Musimy wziąć jedno pod uwagę. Uruchamiając przeglądarkę z Pythona poprzez driver do testów Selenium musimy wskazać w jakim trybie ta przeglądarka ma się uruchomić.
Domyślnie uruchomiona zostanie w trybie normalnym, czyli mechanizmy zabezpieczeń będą funkcjonować normalnie. Czasem jednak faktycznie przydaje się uruchomienie z pominięciem zabezpieczeń (tylko do celów testowych, można sobie nieźle namieszać i koniec końców zostanie nam jedynie stwierdzenie):

“ale jak to, u mnie działa” :laughing:

3.1.Środowisko testowe bez SOP

Wróćmy jednak jak to zrobić, czyli środowisko testowe bez SOP.
W poprzednim wpisie wskazywałam jak uruchomić z poziomu pythona środowisko do testów.
Rozszerzymy trochę kod z tego posta poprzez dodanie do drivera odpowiednich flag:

1
2
3
4
5
6
7
8
9
10
11
12
13
from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("test-type") 
chrome_options.add_argument("--disable-web-security") # zabezpieczenia webowe nieaktywne

driver = webdriver.Chrome('/ścieżka/do/rozpakowanego/drivera',options=chrome_options)
driver.get("http://link.jaki.chcemy testować ")
driver.quit() # zamknij przeglądarkę po wykonaniu testów

# ----- Możemy jeszcze dodać inne opcje np. otwórz okno w określonym rozmiarze:
chrome_options.add_argument("--window-size=1920,1080")
...

Spis dostępnych flag dla chromium

4.Słowem końcowym

Wyłączenie zabezpieczeń przeglądarki wydaje się słabym pomysłem.
Tak, wiem. Nie jest to tryb do surfowania po sieci :smiley:
Także w testowaniu może nam utrudnić. Musimy pamiętać w jakim celu wyłączamy zabezpieczenia. Po sprawdzeniu tego, co chcieliśmy, powinniśmy wrócić do trybu normalnego :cop:.

Jozdowska Edyta * FullStack Developer

Pisanie kodu jest moją pasją. Zajmuję się tym od przeszło 10 lat, z większą lub mniejszą intensywnością.
Piszę kod w PHP, JS, SCSS i Python. Nie stronię też od poznawania nowych, lub jak kto woli starych rozwiązań jak Jekyll oraz innych języków np. Java.

więcej o mnie