2017-04-10 3 views
1

Ich versuche, testen für Web-Anwendung - Ich habe Selenium Standalone 3.2 Server mit VNC in Docker und PHPUnit 5.7.19.PHPUnit löst Ausnahmen aus, wenn es keine geben sollte

jedoch eine Linie

$this->webDriver->findElement(WebDriverBy::xpath($main_button_xpath))->click(); 

manchmal wirft (aber manchmal nicht) eine Ausnahme, wenn es nicht sollte - ich habe es über VNC und die Zieltaste gesehen wurde beobachtet und war auf dem Bildschirm vorhanden und es war immer noch die Ausnahme. Diese Fehler traten auf, seit ich den Selenium-Server von 2.57 aktualisiert habe.

Haben Sie eine Idee, wie Sie es besser reparieren oder debuggen können?

Vielen Dank

EDIT: die Ausnahme

The element reference is stale. Either the element is no longer attached to the DOM or the page has been refreshed. 
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html 
Build info: version: '3.2.0', revision: '8c03df6', time: '2017-03-02 09:34:51 -0800' 
System info: host: 'dbcbaf52ae71', ip: '172.17.0.3', os.name: 'Linux', os.arch: 'amd64', os.version: '3.10.0-514.10.2.el7.x86_64', java.version: '1.8.0_121' 
Driver info: org.openqa.selenium.firefox.FirefoxDriver 
Capabilities [{moz:profile=/tmp/rust_mozprofile.JUP1ydgC8zCR, rotatable=false, timeouts={implicit=0, page load=300000, script=30000}, pageLoadStrategy=normal, platform=ANY, specificationLevel=0, moz:accessibilityChecks=false, acceptInsecureCerts=false, browserVersion=52.0, platformVersion=3.10.0-514.10.2.el7.x86_64, moz:processID=17210, browserName=firefox, platformName=linux}] 
Session ID: 47bf2157-c7a8-47ea-a82a-3ab3ddd0ee61 
+0

Haben Sie ein Beispiel für die tatsächliche Ausnahmebedingungsnachricht und die Stack-Ablaufverfolgung? – segFault

+0

@segFault hinzugefügt die Ausnahme –

Antwort

0

Haben Sie versucht, smth wie dies zu tun?

$wait = new \Facebook\WebDriver\WebDriverWait($driver, 5, 250); 
$condition = \Facebook\WebDriver\WebDriverExpectedCondition::presenceOfElementLocated(Facebook\WebDriver\WebDriverBy::xpath($main_button_xpath)); 

$btn = $wait->until($condition); 
$btn->click(); 

UPDATE:

Ansatz iterative versucht zu tun smth wie unten geschrieben aussehen könnte. Immer noch glaube ich, dass dies nur helfen kann, je nachdem, was auf der Seite vor sich geht.

$limit = 20; // might be different 
$staleException = NULL; 

for($i = 1; $i <= 20; $i++){ 
    try{ 
     // assuming $webDriver is ready to use and $main_button_xpath, too 
     $webDriver->findElement(WebDriverBy::xpath($main_button_xpath))->click(); 
     $staleException = NULL; 
     break; 
    } catch (\Facebook\WebDriver\Exception\StaleElementReferenceException $ex) { 
     $staleException = $ex; 
     usleep(250000); // 250 milliseconds wait 
    } 
} 

if($staleException){ 
    throw $staleException; 
} 

und Ihren Kommentar zu beantworten: Ja, ich glaube, dass es ihm das Gefühl der smth sauber und ordentlich Code keine richtige Lösung ist. Um solche Dinge zu vermeiden, sollten wir Kenntnisse über diese etwas untergeordneten Details haben, was mit html und js auf der Seite passiert, um zu verstehen, welche Strategie der Verteidigung zu wählen ist. Ich glaube nicht, dass es eine andere "universelle Lösung" geben könnte, abgesehen von einer Reihe von Strategien für jede knifflige Sache (oder knifflige Art von Dingen, was auch immer) passiert.

+0

wird versuchen, aber warum passiert das? Es funktionierte perfekt, kurz bevor das Update auf 3.2 –

+0

Ihr Update auf Ausnahmedetails sah. Ich denke, die 'Warte'-Fähigkeit wird das Problem nicht lösen. Sieht so aus, als ob es das Element findet, aber danach verliert es es. Irgendwelche komplizierten JS auf der Seite? – xmike

+0

Ja, es ist eine CRM-Software geschrieben in PHP und JS –

Verwandte Themen