Selenium-Webdriver Ruby --> Wie zu warten, bis die Bilder vollständig geladen werden, klicken Sie auf nach
Ich bin sehr neu in Ruby und Selenium-Webdriver, also bitte, Hilfe 🙂
Ich versuche zu öffnen, die E-Mail-Kampagne an meinem Posteingang, dass hat Bilder und einen screenshot im firefox. Aber ich kann nicht warten, bis die Bilder vollständig geladen. Sobald ich Sie auf 'Bilder Anzeigen' , ein screenshot ist schon gemacht , aber Bild wird nicht geladen damals. Wie kann ich pausiert das Skript und nehmen Sie screenshot einige Zeit später, nachdem alle Bilder angezeigt werden?
Bitte helfen 🙁
Balg ist mein Skript:
enter code here
require 'selenium-webdriver'
browser = Selenium::WebDriver.for :firefox
#==========================================================================================
wait = browser.manage.timeouts.implicit_wait = 15
#==========================================================================================
url = 'https://login.yahoo.com/config/login_verify2?.intl=us&.src=ym'
# Open browser (firefox)
browser.navigate.to url
browser.find_element(:id, 'username').send_keys "some yahoo id"
browser.find_element(:id, 'passwd').send_key "some password"
browser.find_element(:id, ".save").click
browser.find_element(:id, "inbox-label").click
browser.find_element(:xpath, "//div[@class='subj']").click
browser.find_element(:xpath, "//a[@title='Display blocked images']").click
result_page_title = browser.find_element(:tag_name, 'title')
puts "Title of the page: \t\t: #{result_page_title.text}"
browser.save_screenshot "1.jpg"
- Ist der code vollständig ist? Sieht aus wie es mindestens ein
end
Anweisung fehlt an der Unterseite.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
Implicit Wait and Explicit Wait
zu warten, für eine bestimmte Web-Element, bis es erscheint in der Seite. Die Wartezeit können Sie definieren, und das ist, hängt von der Anwendung.Explizite Warten:
Einer expliziten wartet, ist der code, den Sie definieren, zu warten, bis eine bestimmte Bedingung Eintritt, bevor Sie fortfahren weiter im code. Wenn der Zustand erreicht, beendet das warten und gehen Sie die weiteren Schritte.
Code:
Oder
Dieser wartet bis zu 30 Sekunden vor dem Wurf eine TimeoutException oder wenn es feststellt, dass das element wird ein Rückgaberecht von 0 - 30 Sekunden. WebDriverWait standardmäßig ruft die ExpectedCondition alle 500 Millisekunden, bis er wieder erfolgreich. Eine erfolgreiche Rückkehr ist für ExpectedCondition Typ ist Boolean true zurückgeben, oder nicht Rückgabewert null für alle anderen ExpectedCondition Arten.
Können Sie ExpectedConditions Klasse, wie Sie für die Anwendung.
Implizite Warten:
Implizite warten, ist zu sagen, WebDriver Umfrage der DOM für eine bestimmte Zeit, wenn Sie versuchen zu finden, ein element oder Elemente, wenn Sie nicht sofort verfügbar sind
Code:
Eine Sache im Auge zu behalten ist, dass, sobald die implizite Wartezeit festgelegt ist - Sie bleiben für die Lebensdauer des WebDriver-Objekt-Instanz
Für weitere Informationen benutzen Sie diesen link http://seleniumhq.org/docs/04_webdriver_advanced.jsp
Dem obigen code ist in
Java
. Ändern, wie Ihre Sprache benötigen.Ruby-code aus die docs (klicken Sie auf das 'ruby' - Taste):
Was für mich funktioniert
Hinzufügen, um die obige Antwort, hier ist, wie ich die Verwendung von impliziten und expliziten warten in Ruby.
Implizite Warten,
Ich übergeben Sie diese option, um Selenium::WebDriver nach der Initialisierung mit ein paar Zeilen wie diese:
Einfach ersetzen "10" mit der Zahl der Sekunden, die Sie möchten, den browser zu warten, bis die Seite aktualisiert und events.
Explizite Warten
Gibt es zwei Schritte zu erklären, eine explizite warten an Selen. Zuerst stellen Sie die timeout-Zeit durch die Deklaration einer wait-Objekt, und rufen Sie das warten mit Selenium::Webdriver ist .bis Methode. Es würde so Aussehen, in Ihrer Beispiel:
Diesem würde sagen, der Webdriver warten Sie maximal 10 Sekunden für das Bild-element angezeigt werden. Sie können auch verwenden .aktiviert? wenn das element, das Sie warten, ist ein interaktives element - dies ist besonders nützlich, wenn Sie arbeiten mit Ajax-basierte Formulare.
Können Sie auch erklären, eine explizite Wartezeit an den Anfang Ihres Skripts, und klicken Sie dann verweisen Sie das Objekt erneut aus, Wann immer Sie es brauchen. Es gibt keine Notwendigkeit zu deklarieren, es sei denn, Sie wollen eine neue timeout-Wert. Persönlich, ich mag zu halten, die warten.erst verpackt in einer Methode, weil ich weiß, ich werde darauf verweisen wiederholt. So etwas wie:
(Ich finde es einfacher einfach zu erklären-browser, wie eine Instanz-variable, so dass Sie nicht haben, um es zu übergeben an die Methode jedes mal, aber das Teil ist bis zu Ihnen, ich denke,?)
ExpectedConditions jedoch nicht unterstützt in der Ruby-Selen-Bindungen. Dieses snippet unten tut das gleiche wie ExpectedConditions.elementToBeClickable anklickbar bedeutet einfach nur "sichtbar" und "aktiviert".