Wie man eine Selen/Ruby bot zu warten, bevor eine Aktion ausgeführt wird?
Baue ich eine Selen/Ruby-web-bot, der Klicks auf Elemente. Das problem ist, manchmal gibt es nicht genug Zeit für die Seite zu laden, bevor der bot entscheidet, kann es nicht finden, das element.
Was die Ruby Weg zu bekommen Selen zu warten, bevor eine Aktion ausgeführt wird? Ich würde es vorziehen, explizite warten, aber ich bin in Ordnung mit impliziten zu warten.
Ich habe versucht, die wait.until
Methode:
require "selenium-webdriver"
require "nokogiri"
driver = Selenium::WebDriver.for :chrome
wait = Selenium::WebDriver::Wait.new(:timeout => 15)
driver.navigate.to "http://google.com"
driver.wait.until.find_element(:class, "gb_P").click
Aber ich bin immer der folgende Fehler:
Undefined method 'wait' for <Selenium::WebDriver>
Ich auch versucht:
require "watir-webdriver/wait"
...
driver.find_element(:class, "gb_P").wait_until.click
aber das ist auch mir eine nicht definierte Methode Fehler:
undefined method `when_present' for #<Selenium::WebDriver...>
- Wenn Sie gerade begonnen haben, wechseln Sie zu capybara. Capybara wartet standardmäßig verwendet Selen (oder andere Treiber) unter der Haube, und die API ist einfach zu verwenden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie mit
wait
alsWebDriver
- Funktion, ist es aber nicht. Versuchen Sie, dieseHaben Sie versucht, die, wenn Sie vorhanden ist, zu warten, bis die Taste (Sie können auch warten, für einen bestimmten div -)
Als für das explizite warten
oder einen besseren Weg, als keine Zeit zu verlieren
Okay. Diese Antwort ist gebeten worden, viele Male, in vielen verschiedenen Kontexten. Also, ich möchte nur zu beantworten, es hier einmal und für alle.
Gibt es drei Möglichkeiten, dies getan werden kann. Und jeder ist nützlich in einem bestimmten Kontext.
Ersten, die Sie verwenden können, eine EXPLIZITE warten. Das hat nichts damit zu tun, ob die Seite geladen wird oder nicht. Es sagt einfach das Skript warten. In anderen Worten, wenn Ihre Seite geladen wird, die in 11 Sekunden und Ihre ausdrückliche warten Sie 10 Sekunden, das anklickbare element noch nicht verfügbar. Sie können arbeiten, um diese Ineffizienz durch die Verwendung von einem erwarteten Zustand. Siehe, z.B., die Selen-manpages:
^ Das warten entweder: 10 Sekunden lang ODER bis das element gefunden ist.
Zweiten, die Sie verwenden können, eine implizite warten. Dies ist sehr ähnlich zu der ausdrücklichen warten mit dem erwarteten Zustand. Wo jedoch die explizite wartet, gilt für das element abgefragt wird, implizite warten, gilt für die WebDriver Objekt. In anderen Worten, wenn Ihr Skript verwendet nur einen einzigen webdriver, wird es warten, entweder: die implizite Wartezeit für JEDES element, ODER bis jedes element gefunden wird (bis zum Versagen). Zum Beispiel:
Dritten, können Sie rufen eine Javascript-Funktion auf die Seite. Der Vorteil dieser ist, dass, sobald die Seite mit Javascript lädt, wird der Artikel angeklickt werden und man nicht eigentlich warten, bis die Seite Rendern. Eine Menge Zeit, wenn Sie "warten für die Seite" du bist eigentlich warten auf die client Seite für die rendering-engine zum erstellen der Seite. Umgehen kann man diesen Prozess, indem Sie einfach das zugrunde liegende element, bevor die Seite tatsächlich gerendert wird.
Der Nachteil dieser ist, dass es nicht ein Spiegel der menschlichen Klick auf die Seite. Zum Beispiel, wenn die Schaltfläche, die Sie klicken möchten, ist verborgen durch ein popup. Selen können Sie nicht klicken Sie auf es, aber eine JS-Funktion.
Können Sie diese Methode verwenden, indem Sie tun:
Eine mögliche Antwort liegt in Ihren stacktrace.
Verwendung von RC und Webdriver in C# finde ich ist der effektivste Weg, um den Fahrer auf Sie warten:
Verwenden Sie einfach
Dann Sie können warten, bis es.
Können Sie auch einfach verwenden, Schlaf (#), wird dieser Ursache es warten, und je nach editor kann man sehen, welche Varianten Sie nutzen können, also statt Sekunden können Sie gehen, um etwas höher oder niedriger, in Ruby, die Sie gar nicht haben, es zu erklären.
Geben Sie einfach schlafen und eine Zahl in der Klammer, und Sie sollte es halt für die Zeit in Sekunden, die anderen Hinweis, warum dies ist eine Lösung, die vielleicht nicht optimal sein, aber wenn Sie nur brauchen, es warten noch ein bisschen auf eine Seite, die nie so lange dauert es ist toll, eine Zeile code zu verwenden.