2012-12-05 6 views
8

Oto opis tego, co próbuję zrobić przy użyciu Selenium Webdriver w Pythonie: Mam swoją stronę internetową, która przyjmuje jako dane wejściowe różne parametry dla konkretnego produktu i podaje cenę produktu o tych parametrach. Utrzymuję wszystkie parametry oprócz jednego i zmieniając jeden określony parametr w pętli for, aby zobaczyć, jak zmienia się cena w zależności od tego konkretnego parametru. Raz zmienić parametr i wysłać formularz, a następnie używam niejawnie czekać następująco:Poczekaj, aż strona zostanie odświeżona

submit_btn.click() 
driver.implicitly_wait(10) 
driver.find_element_by_name("Buy_Product") 
soup=BeautifulSoup(driver.page_source) 

Po wprowadzeniu pierwszego zestawu parametrów strona jest przejrzysta i nie zawierają buttton z nazwą „Buy_Product” tak ja Używam linii aby upewnić się, że kod czeka na pojawienie się tego przycisku, co oznacza, że ​​strona zawiera teraz cenę, którą chcę wyodrębnić. Problem polega na tym, że po raz drugi w pętli, gdy zmieniam parametr i próbuję uzyskać nową cenę, przycisk "Buy_Product" już istnieje, więc niejawnie oczekiwanie już nie działa, a czasami zajmie poprzednie page_source, zanim cena czas do aktualizacji. Trudnym elementem jest to, że czasami nawet dla różnych parametrów cena jest taka sama, więc nie mogę po prostu sprawdzić, czy widoczny tekst ceny się zmienił. Jakieś pomysły, jak można to rozwiązać bez użycia time.sleep?

+0

Ma 'wait_for_page_load()' zostały usunięte ...? – Izkata

+0

Czy ponownie ładujesz całą stronę lub aktualizujesz cenę za pomocą javascript? – Edu

+0

możesz przesłać formularz, który renderuje nową stronę Edu – luckyfool

Odpowiedz

1

Sytuacja jest tu coś trudne ... Nie jestem pewien, czy to pomaga ... ... ale spróbować ...

Moja sugestia jest na wstrzyknięciu JavaScript, gdzie mogę sprawdzić, czy Strona jest całkowicie załadowana i czeka do tego czasu. (C# Kod fragment)

IWait<IWebDriver> Driver_Wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00)); 
Driver_Wait.Until(Driver => ((IJavaScriptExecutor)JS_Driver).ExecuteScript("return document.readyState").Equals("complete")); 

Mam nadzieję, że to pomoże .... Wszystkiego najlepszego :-)

+0

dziękuję, że spróbuję w pytonie – luckyfool

+0

@luckyfool - czy to działa dla ciebie? –

1

Jeśli rozwiązanie Anuragh27crony nie działa dla Ciebie, można też myśleć o czekając na jQuery być nieaktywnym. Kod będzie wyglądać w większości takie same, lecz przechodzą w tym javascript wywołania zamiast:

ExecuteScript("return jQuery.active == 0")