C# selenium i chrome driver sczytywanie danych ze stron

0

Cześć!

Mam problem ze sczytywaniem danych ze stron https://www.mediaexpert.pl/telewizory-i-rtv/telewizory/telewizor-sony-led-kd-65x7056baepmu a przy niektórych coś idzie nie tak i nie wiem dlaczego.
Dla testów chciałem sobie rozczytać jakieś dane z ogólnodostępnych stron np. mediaexpert i tam natrafiłem na problemy.
Wziąłem np. stronę dot. telewizora Sony: https://www.mediaexpert.pl/telewizory-i-rtv/telewizory/telewizor-sony-led-kd-65x7056baep
i chciałem odczytać nazwę tego telewizora za pomocą kodu z tego poradnika na YT: www.youtube.com/watch?v=CpugqTr2j60

 IWebDriver browser = new ChromeDriver();
            try
            {
                browser.Navigate().GoToUrl("https://www.mediaexpert.pl/telewizory-i-rtv/telewizory/telewizor-sony-led-kd-65x7056baep"); 

                var title = browser.FindElement(By.XPath("/html/body/div[8]/div[16]/div[1]/div/div[1]/div[1]/div[2]/div[1]/div[1]/h1"));
                tb_title.Text = title.Text;
            }
            finally
            {
                //browser.Close();
                browser.Quit();
            }

Na formatce mam pole TextBox (tb_title) gdzie chcę wrzucić przeczytaną nazwę telewizora.
I tutaj jest problem. Niekiedy wszystko działa poprawnie a niekiedy wywala mi błąd.

OpenQA.Selenium.NoSuchElementException: „no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[8]/div[16]/div[1]/div/div[1]/div[1]/div[2]/div[1]/div[1]/h1"}
  (Session info: chrome=89.0.4389.114)”

zauważyłem że błąd wywala mi wtedy kiedy na stronie z mediaexpert pojawi się okienko (popup) z powiadomieniem (zezwalaj/blokuj).
Próbowałem w chromie ustawić że ta strona (mediaexpert) jest bezpieczna i żeby nie pojawiały mi się żadne powiadomienia z tej strony ale to nie zadziałało.

Później próbowałem zrobić coś podobnego na innych stornach np. biedronka.pl i tam wszystko (za każdym razem) działało poprawnie.

Czy ktoś robił coś kiedyś w Selenium i spotkał się z czymś takim?

0

Najprostszym rozwiązaniem na Twoim poziomie będzie zamknięcie tego popup'a za pomocą selenium. Spróbuj zrobić sobie dodatkowy krok w skrypcie, gdzie klikasz na zamknięcie tego okienka, a po tym dalej kontynuj logikę którą już dodałeś.

0

no właśnie nie wiem jak się dobrać do tego popup-u.
Miałem pomysł żeby pobrać xpatch-a tego przycisku "zezwól" (z tego popup-a) i "niby kliknąć" w niego, ale nie mogę pobrać xpatch-a tego przycisku.
A może jest jakiś inny pomysł na zamknięcie popup-a z poziomu selenium ale ja go nie znam i niczego na razie w necie ciekawego ni znalazłem.

@javaXd Możesz coś zaproponować?

0

Połowicznym rozwiązaniem jest odczekanie aż cała strona się załaduje (wstawić jakieś opóźnienie). Ale w dalszym ciągu trzeba pozamykać popup-y bo inaczej wywala błąd że nie można znaleźć elementu którego szukamy na stronie.

0

Spróbuj napisać logikę, która sprawdzi czy element jest widoczny dla xpatha:

//div[@class='c-alert is-cookies is-close']/a

i jeśli jest to kliknij w okno zamykające. I dopiero potem wyszukaj tytuł.
A jeśli chodzi o inne okienko to wstaw screena - jasnowidzami nie jesteśmy :)

0

Problem jest taki, że gdy pojawia się popup, to zmienia się struktura html, więc ten xpath przestaje działać. Przykładowe rozwiązanie:

var offerTitle = browser.FindElement(By.XPath("//h1[@class='a-typo is-primary']")).Text;

1 użytkowników online, w tym zalogowanych: 0, gości: 1