2017-05-13 3 views
1

Ich habe mit Selen gespielt und bin auf Probleme gestoßen. Ich habe ein Problem, den Test fortzusetzen, wenn das Element nicht vorhanden ist.Test fortsetzen, wenn Element nicht vorhanden ist (mit try catch)

Das ist mein PHP-Code

if ($this->seePageHasElement('ctl00_cphMain_ResultsPager_repPager_ctl05_liPage') != false) { 
    $nrOfPages = $this->seePageHasElement('ctl00_cphMain_ResultsPager_repPager_ctl05_liPage'); 
} 
if ($this->seePageHasElement('ctl00_cphMain_ResultsPager_repPager_ctl04_liPage') != false) { 
    $nrOfPages = $this->seePageHasElement('ctl00_cphMain_ResultsPager_repPager_ctl04_liPage'); 
} 
if ($this->seePageHasElement('ctl00_cphMain_ResultsPager_repPager_ctl03_liPage') != false) { 
    $nrOfPages = $this->seePageHasElement('ctl00_cphMain_ResultsPager_repPager_ctl03_liPage'); 
} 
if ($this->seePageHasElement('ctl00_cphMain_ResultsPager_repPager_ctl02_liPage') != false) { 
    $nrOfPages = $this->seePageHasElement('ctl00_cphMain_ResultsPager_repPager_ctl02_liPage'); 
} 
if ($this->seePageHasElement('ctl00_cphMain_ResultsPager_repPager_ctl01_liPage') != false) { 
    $nrOfPages = $this->seePageHasElement('ctl00_cphMain_ResultsPager_repPager_ctl01_liPage'); 
} 

function seePageHasElement($id) 
    { 
     try { 
      $element = $this->webDriver->findElement(WebDriverBy::id($id)); 
     } catch (\PHPUnit_Framework_AssertionFailedError $f) { 
      return false; 
     } 
     return $element; 
    } 

Und das ist Fehler von Selen-Server

There was 1 error: 

1) MyTests::testSpiderThat 
Facebook\WebDriver\Exception\NoSuchElementException: no such element: Unable to locate element: {"method":"id","selector":"ctl00_cphMain_ResultsPager_repPager_ctl05_liPage"} 
    (Session info: chrome=58.0.3029.110) 
    (Driver info: chromedriver=2.29.461591 (62ebf098771772160f391d75e589dc567915b233),platform=Windows NT 10.0.14393 x86_64) (WARNING: The server did not provide any stacktrace information) 
Command duration or timeout: 40 milliseconds 
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html 
Build info: version: '3.4.0', revision: 'unknown', time: 'unknown' 
System info: host: '123123', ip: '172.18.11.210', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_77' 
Driver info: org.openqa.selenium.chrome.ChromeDriver 
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.29.461591 (62ebf098771772160f391d75e589dc567915b233), userDataDir=C:\Users\myComp\AppData\Local\T 
emp\scoped_dir5528_32323}, takesHeapSnapshot=true, pageLoadStrategy=normal, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=58.0.3029.110, platform=XP, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, loc 
ationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true, unexpectedAlertBehaviour=}] 
Session ID: 7220150b6e8bdc6a539de93f2771bf78 
*** Element info: {Using=id, value=ctl00_cphMain_ResultsPager_repPager_ctl05_liPage} 

Die Frage ist also, wie man richtig überspringen/diesen Fehler unterdrücken, wenn Elemente nicht vorhanden sind? Ich möchte meinen Test fortsetzen, aber es hört einfach auf ... Vielleicht gibt es ein Problem mit der Selenal-Standalone-Version? Wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen und ich werde zur Verfügung stellen. Danke

+0

Ich weiß nichts über Selenium, aber meine Vermutung ist, dass Sie versuchen, den falschen Typ von 'Exception' zu fangen, nämlich: 'PHPUnit_Framework_AssertionFailedError'. Die ausgelöste 'Exception' hat jedoch den Typ' .. \ NoSuchElementException'. Also, es sei denn, das letztere erweitert das erstere, Sie sollten '.. \ NoSuchElementException' (ebenso) abfangen, oder vielleicht eine noch allgemeinere 'Exception'. –

Antwort

1

Die Methode, die Sie verwenden, sieht sehr ähnlich zu einem, den ich selbst benutze. Ich verwende das Codeception-Framework, das mir das Schreiben von Selenium-Tests wesentlich erleichtert hat.

Mit Codeception einen Wert von einem Element zu erhalten, nur wenn es auf der Seite sichtbar ist, funktioniert dies gut für mich:

if($I->seePageHasElement(['id' => 'my_first_element_id'])) { 
    $nrOfPages = $I->grabTextFrom(['id' => 'my_element_id']); 
} 

public function seePageHasElement($element) 
{ 
    try { 
     $this->getModule('WebDriver')->seeElement($element); 
    } catch (\PHPUnit_Framework_AssertionFailedError $f) { 
     return false;   
    } 
    return true; 
} 

Wenn Sie nicht Codeception sind, vielleicht müssen Sie die Methode umschreiben in etwa wie folgt (beachten Sie, dass Sie verschiedene Arten von Ausnahmen in der gleichen Zeit zu fangen versuchen können):

public function seePageHasElement($element) 
{ 
    try { 
     $this->webDriver->seeElement($element); 
    } catch (\PHPUnit_Framework_AssertionFailedError $f) { 
     return false; 
    } catch (\NoSuchElementException $f) { 
     return false; 
    } catch (\Exception $f) { 
     return false; 
    } 
    return true; 
} 

auf der anderen Seite, wenn Sie die Prüfung nicht bestanden, aber nur nicht will, den Test stoppen wollen Wieder kommt Codeception zur Rettung. Alle see() Methoden haben entsprechende canSee() Methoden. Mit den canSee() Methoden wird der Test fehlschlagen, aber die Ausführung wird nicht gestoppt.

+0

guten job mann ... thx für hilfe –

+0

Gern geschehen! – sunomad