2012-12-05 18 views
8

Hier ist eine Beschreibung von dem, was ich versuche mit Selenium Webdriver in Python zu tun: Ich habe meine Website, die als Eingabe verschiedene Parameter für ein bestimmtes Produkt und gibt einen Preis für das Produkt mit diesen Parametern. Ich halte alle Parameter bis auf einen konstant und variiere einen bestimmten Parameter in einer for-Schleife, um zu sehen, wie der Preis entsprechend diesem einen spezifischen Parameter variiert. Sobald ich den Parameter zu ändern einreichen i die Form und verwenden Sie dann warten i implizit wie folgt:warten bis Seite aktualisiert

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

wenn der erste Satz von Parametern Eingabe der Seite klar ist und es enthält nicht die buttton mit dem Namen „Buy_Product“ so i ist mit der Linie

driver.find_element_by_name("Buy_Product") 

zu dem Code stellen Sie sicher, für diese Schaltfläche, welche die Seite nun bedeutet, zu erscheinen wartet den Preis enthält i extrahieren möge. Das Problem ist, dass das zweite Mal durch die Schleife, wenn ich den Parameter variieren und versuchen, den neuen Preis zu bekommen die Schaltfläche "Buy_Product" ist bereits da so implizit warten nicht mehr funktioniert und manchmal wird die vorherige page_source, bevor der Preis hat Zeit, um aktualisiert zu werden. Der schwierige Teil ist, dass manchmal sogar für verschiedene Parameter der Preis der gleiche ist, so kann ich nicht nur überprüfen, ob der sichtbare Text des Preises geändert hat. Irgendwelche Ideen, wie dies gelöst werden kann, ohne time.sleep zu verwenden?

+0

Hat 'wait_for_page_load()' entfernt worden ist ...? – Izkata

+0

Laden Sie die gesamte Seite neu oder aktualisieren Sie den Preis mit Javascript? – Edu

+0

Sie reichen ein Formular, das eine neue Seite rendert Edu – luckyfool

Antwort

1

Die Situation ist etwas heikel hier ... Ich bin nicht sicher, ... ob das hilft ... aber einen Versuch geben ...

Mein Vorschlag auf JavaScript-Injektion ist, wo ich überprüfen, ob die Seite ist komplett geladen und es wartet bis dahin. (C# Code-Snippet)

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")); 

Ich hoffe, das hilft .... All the Best :-)

+0

danke ich werde es versuchen in Python – luckyfool

+0

@luckyfool - hat das für Sie funktioniert? –

1

Wenn Anuragh27crony-Lösung nicht für Sie arbeiten, können Sie auch für jquery über das Warten denken inaktiv sein. Der Code sieht meist die gleichen, sondern in diesem JavaScript-Aufruf übergeben:

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