2009-03-11 2 views
26

Hier ist, was ich tue:Selenium click() Ereignis scheint nicht immer ausgelöst zu werden => führt zu Timeout?

selenium.click("link=mylink"); 
selenium.waitForPageToLoad(60000); 

// do something, then navigate to a different page 
// (window focus is never changed in-between) 

selenium.click("link=mylink"); 
selenium.waitForPageToLoad(60000); 

Der Link "mylink" existiert, der erste Aufruf von Klick() funktioniert immer. Aber der zweite Klick() scheint manchmal zu funktionieren, manchmal nicht.

Es sieht so aus, als ob das Ereignis click() überhaupt nicht ausgelöst wird, weil die Seite nicht einmal zu laden beginnt. Leider ist dieses Verhalten untermineralistisch.

Hier ist, was ich schon versucht:

  1. Set längere Zeit Timeout
    => nicht vorhanden ist eine Seite

  2. Warten für ein Element half
    => funktioniert nicht nach dem Laden Entweder beginnt die Seite nicht einmal zu laden

Für jetzt I endete das Aufrufen von click() zweimal, also:

selenium.click("link=mylink"); 
selenium.waitForPageToLoad(60000); 

// do something, then navigate to a different page 
// (window focus is never changed in-between) 

selenium.click("link=mylink"); 
selenium.click("link=mylink"); 
selenium.waitForPageToLoad(60000); 

Das wird funktionieren, aber es ist keine wirklich nette Lösung. Ich habe auch in einem anderen Forum gesehen, wo jemand so etwas wie ein ‚clickAndWaitWithRetry‘ schreiben vorgeschlagen:

try { 
     super.click("link=mylink"); 
     super.waitForPageToLoad(60000); 
    } 
    catch (SeleniumException e) { 
     super.click("link=mylink"); 
     super.waitForPageToLoad(60000); 
    } 

Aber ich denke, das ist auch keine richtige Lösung .... Irgendwelche Ideen/Erklärungen, warum das Click () Ereignis wird manchmal nicht ausgelöst?

+0

Normalerweise verwende ich 'setspeed' anstelle von timeout, wenn ich aus irgendwelchen Gründen mein Skript verlangsamen möchte. –

Antwort

1

Die Seite wurde nicht richtig geladen, wenn Sie darauf klicken. Suchen Sie nach verschiedenen Elementen auf der Seite, um sicherzustellen, dass die Seite geladen wurde.

Warten Sie außerdem, bis der Link angezeigt wird und sichtbar ist, bevor Sie darauf klicken.

1

Stellen Sie sicher, dass Sie das Zeitlimit an der richtigen Stelle erhöhen. Die von Ihnen geposteten Zeilen sind:

selenium.click("link=mylink"); 
selenium.waitForPageToLoad(60000); 

Diese Wartezeit ist für das Laden der Seite, die zurückkommt Nach dem Klick. Aber das Problem, das Sie beschreiben, ist, dass es versagt, wenn Sie versuchen, den Klick zu machen. Also, stellen Sie sicher, dass Sie die Wartezeit vor diesem erhöhen.

selenium.click("link=mylink"); 
selenium.waitForPageToLoad(60000); 

// do something, then navigate to a different page 
// (window focus is never changed in-between) 
// after the last click in these steps: 
selenium.waitForPageToLoad(60000); 
// anything else that happened after that 

selenium.click("link=mylink"); 
selenium.waitForPageToLoad(60000); 
4

Ich habe für eine Weile Selen getan, und ich habe wirklich eine Abneigung gegen waitForPageToLoad() entwickelt. Sie sollten immer nur darauf achten, dass das fragliche Element existiert.

Ich finde, dass diese Methode scheint, die meisten seltsamen Probleme zu lösen, die ich auf diese Weise treffe. Die andere Möglichkeit ist, dass Sie Javascript haben, das verhindert, dass die Verbindung irgendwas macht, wenn Sie das erste Mal klicken. Es scheint unwahrscheinlich, aber einen Doppel-Check wert.

+0

Hey, sogar ich habe ein Problem mit JavaScript-Hyperlinks. Ich habe eine Schaltfläche mit href = "javascript :;". Wenn ich mit selen-rc darauf klicke, zeigt die Statusleiste des Browsers "javascript :;", aber es findet keine Aktion statt. Irgendwelche Workarounds dafür ??? - Vamyip – vamyip

+0

Das erste, was ich versuche, wenn das passiert, ist mouseDown und mouseUp statt klicken. Das macht normalerweise den Trick, auch wenn es irgendwie dumm ist. –

10

Manchmal, scheinbar zufällig, möchte Selen nicht auf bestimmte Anker-Tags klicken. Ich bin mir nicht sicher, was es verursacht, aber es passiert.Ich finde, in den Fällen, w/ein lästiges Link anstatt das zu tun

selenium.click(...) 

selenium.fireEvent(locator, 'click'); 

tun Wie andere über mich gesagt haben, ich habe mit Anker-Tags speziell Probleme hatte, die wie folgt aussehen:

<a href="javascript:...." > 
+0

Hallo, ich konnte es nicht schaffen, es sagt immer noch, es hat funktioniert, aber es tut nichts !. Der Befehl click funktioniert, wartet aber darauf, dass die Seite geladen wird (wenn dies nicht der Fall ist). Irgendein Vorschlag? –

+0

Ich habe das gleiche Problem wie Diego ... Irgendwelche Vorschläge? – Ekaterina

+2

ASP.NET LinkButton-Steuerelemente werden automatisch zu einem Anker mit "javascript: __ doPostback (*" (wenn in HTML gerendert). Es ist einfach genug, einen LinkButton zu einem Button zu machen. Wenn Sie jedoch ein fest codiertes HTML-Anchor-Tag haben Wenn Sie JavaScript aufrufen, haben Sie möglicherweise kein Glück mit diesem Tool.Ich denke, der Klick passiert nie, weil Selenium JavaScript hinter den Kulissen verwendet und den Job des Ankers überschreiben kann - nennen Sie das JavaScript – MacGyver

3

Ich habe gerade WebDriver (Selenium 2.0) versucht und festgestellt, dass WebElement # sendKeys (Keys.ENTER) funktioniert.

0

Versuchen Sie folgendes:

selenium.fireEvent(ID, "keypress"); 
0
selenium.click("link=Continue to this website (not recommended)."); 
Thread.sleep(5000); 
2

Hier dieses funktioniert:

selenium.waitForPageToLoad("60000"); 

selenium.click("link= my link"); 
0

Ich habe das gleiche Problem wurde und festgestellt, dass ich den Text des Links bekommen haben zuerst. Ich weiß, es ist nicht der ideale Weg, es zu tun, aber ich bin glücklich, dass meine Links eindeutig benannt sind.

C# -Code:

var text = Selenium.GetText(myLocator); 
Selenium.Click("link=" + text); 
0

ich das gleiche Problem habe :(mit Selen IDE 1.0.10, phpunit 3.5, Selen RC Server 1.0.3

EDITED: 
The culprit seems to be browser FF 3.6.13 , after upgrade to FF 3.6.14 
    all my errors are gone . My tests are working like charm :). 

Selenium IDE 1.0.10 
PHPUnit: 3.5.6 
Selenium Server:selenium-2.0b1 (selenium-2.0b2 is buggy) 
2

ich in dieses leite Aus meinen Verwendungen scheint es, dass das Folgende das konsistenteste ist:

@browser.click(selector, {:wait_for => :page}) 

Nicht genau, warum das wäre. Aber es scheint, dass, wenn Sie tun:

@browser.click(selector) 
    [maybe some stuff here too] 
@browser.wait_for(:wait_for => :page) 

Dann könnten Sie für eine Seite wartet am Ende, die bereits geladen ist (das heißt Sie für immer warten am Ende).

grub ich in die Selen-Quellcode und fand dieses Nugget:

def click(locator, options={}) 
    remote_control_command "click", [locator,] 
    wait_for options 
    end 

...

# Waits for a new page to load. 
    # 
    # Selenium constantly keeps track of new pages loading, and sets a 
    # "newPageLoaded" flag when it first notices a page load. Running 
    # any other Selenium command after turns the flag to false. Hence, 
    # if you want to wait for a page to load, you must wait immediately 
    # after a Selenium command that caused a page-load. 
    # 
    # * 'timeout_in_seconds' is a timeout in seconds, after which this 
    # command will return with an error 
    def wait_for_page(timeout_in_seconds=nil) 
    remote_control_command "waitForPageToLoad", 
     [actual_timeout_in_milliseconds(timeout_in_seconds),] 
    end 
    alias_method :wait_for_page_to_load, :wait_for_page 

Im Grunde ist dies das folgende tut:

@browser.click(selector) 
@browser.wait_for(:wait_for => :page) 

jedoch Wie der Kommentar sagt, ist das erste, was notwendig ist, den Befehl: wait_for unmittelbar danach zu verwenden.

Und natürlich ... Wechsel der Reihenfolge bringt Sie in den gleichen Zustand für immer warten.

@browser.wait_for(:wait_for => :page) 
@browser.click(selector) 

Ohne alle Einzelheiten Selen zu wissen, scheint es, als ob Selen die Registrierung benötigt: wait_for auslösen, wenn es als Option mit Klick geben wird. Andernfalls könntest du für immer auf dich warten, wenn du Selenius sagst, dass er kurz zuvor warten soll: wait_for wird aufgerufen.

1

Wenn Sie FireFox verwenden, vergewissern Sie sich, dass Sie 3.6 oder höher verwenden. WaitForPageToLoad verwendet die Javascript-Variable 'readyState', aber Firefox hat dies nur in 3.6 unterstützt. Frühere Versionen warten Sie einfach nicht

(siehe org.openqa.selenium.internal.seleniumemulation.WaitForPageToLoad)

3

Selen click() Ereignis scheint nicht immer ausgelöst => Ergebnisse in Timeout werden?

Versuchen Sie selen.pause vor Selenium.click Befehl. Ich habe alles oben versucht, aber keiner von ihnen scheint unser Problem zu lösen. So endlich bekamen wir einen Zauber selenium.pause das Problem für mich gelöst ..

Hoffnung dies Ihr Problem lösen wird auch

2

ich hatte das gleiche Problem - mit Selen 1.0.12 und Firefox 5.0; Ich schaffte es die automatisierten Tests funktioniert so:

  • ich entfernt alle „AndWait“ Befehle (manchmal hängen sie den Test/Browser)
  • Ich habe eine Pause vor dem Klick
  • ich eine waitForVisible hinzugefügt nach dem Klick (normalerweise warte ich auf das nächste HTML-Steuerelement, mit dem ich auf der nächsten Seite interagieren möchte).

Es geht so:

  • waitForVisible OK
  • Pause 1000
  • klicken Sie auf OK
  • waitForVisible link = Go
  • Pause 1000
  • klicken Zum

etc ...

Es scheint, dass die „waitForVisible“ zu früh ausgelöst wird, das heißt, bevor der Event-Handler in die Steuerung eingesteckt sind (also auf die Steuerung hat keine Auswirkung klicken). Wenn Sie 1 Sekunde warten, reicht es aus, die Click-Handler zu verbinden/zu aktivieren ...

Verwandte Themen