2017-05-09 6 views
0

Hat jemand Vorschläge, was mit meinem Code falsch ist? Hier ist der Code:Behat kann nicht mit unsichtbarem Feld interagieren

 echo $this->find("css","#address-container")->getHtml(); 
    $field = $this->find("css","#address-container .region input"); 
    echo $field->isVisible() ? "I can see myself!!!" : "no can not see"; 
    echo $field->getAttribute('type'); 
    $field->setValue("ON"); 

Wenn ich den Test ausführen, das ist das Ergebnis

│   <legend>Address</legend> 
    │   <div class="field city"> 
    │   <label>*City</label> 
    │   <input class="required city" name="address_add[0][city]" value="" type="text"> 
    │   </div> 
    │   <div class="field region"> 
    │   <label>*Prov./State</label> 
    │   <input class="required region" name="address_add[0][region]" value="" type="text"> 
    │   </div> 
    │   <div class="field country"> 
    │   <label>*Country</label> 
    │   <input class="required country" name="address_add[0][country]" value="" type="text"> 
    │   </div> 
    │  no can not seetext 
    Element is not currently visible and so may not be interacted with 
    Build info: version: '2.53.1', revision: 'a36b8b1', time: '2016-06-30 17:37:03' 
    System info: host: 'ubuntu', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.9.15-x86_64-linode81',           java.version: '1.8.0_121' 
    Driver info: driver.version: unknown (WebDriver\Exception\ElementNotVisible) 

Ich erwarte die #address-container .region input sichtbar zu sein. Wenn ich zu meinem Browser gehe und die Schritte manuell durchführe, sehe ich, dass das Regionsfeld sichtbar ist. Andere Dinge, die ich geprüft sind:

  • gibt es keine andere Region Eingabefelder auf der Seite
  • wenn ich Region mit Stadt und Land ersetzen, funktioniert alles einwandfrei
  • gibt es keine JavaScript-Aufruf verzögert, um die Region zu manipulieren Eingabefeld

Was könnte sonst dazu führen, dass das Gebietsfeld ausgeblendet wird? Gibt es bessere Tools, mit denen ich dieses Problem beheben kann?

UPDATE

Wenn ich die Position der Region und Land html wie folgt getauscht:

│   <div class="field country"> 
    │   <label>*Country</label> 
    │   <input class="required country" name="address_add[0][country]" value="" type="text"> 
    │   </div> 
    │   <div class="field region"> 
    │   <label>*Prov./State</label> 
    │   <input class="required region" name="address_add[0][region]" value="" type="text"> 
    │   </div> 

Dann wird Region sichtbar. Aber wenn ich meinen Behath-Code ändere, um nach Land zu suchen, ist das Land unsichtbar!

Ist es etwas anderes, dass ich in einem REAL Browser nicht sehe?

+0

Versuchen Sie, diesen Selektor über inspect im Browser zu durchsuchen, um festzustellen, ob ein einzelnes Element zurückgegeben wird. Sie müssen möglicherweise eine Wartezeit hinzufügen, zunächst können Sie eine blinde Wartezeit wie "sleep (2);" verwenden, um zu testen, und nachdem Sie eine bedingte Wartezeit hinzufügen können. Bitte geben Sie das HTML-Snippet des gesamten # Adresscontainers an. – lauda

+0

Danke Lauda. Ich habe gerade meine Frage aktualisiert. Wenn ich die Reihenfolge der HTML-Knoten für Region und Land umkehre, dann ist die Region sichtbar und das Land nicht. Auch wenn ich Dinge in meinem Webbrowser durch menschliche Augen betrachte, kann ich sehen, dass beide sichtbar sind ... komisch – John

+0

Versuchen Sie einen Selektor wie: '# address-container input.region' oder' # address-container input [name * = Region] ' – lauda

Antwort

0

Das Problem war, dass Selen eine Monitorauflösung von 800x600 hatte. Die Elemente waren also manchmal nicht im Sichtfenster. Wenn ich die Monitorauflösung auf 1366 x 768 erhöhe, hat alles gut funktioniert. Ich war in der Lage, dies zu debuggen, indem ich Selen-Screenshots verwendete.

0

Zunächst ist die Frage wirklich Selenium (weil Sie es als Treiber verwenden: Driver info: driver.version: unknown (WebDriver\Exception\ElementNotVisible)).

Mit Selen, wenn sein Verhalten sich von dem unterscheidet, was Sie in einem Browser sehen ... Versuchen Sie, eine kleine Verzögerung hinzuzufügen. Ich kann sleep(1) oder etwas schlauer sein.

Wirklich viele Probleme kamen von der Tatsache, dass Sie versuchen, auf die Seite direkt nach dem Laden zuzugreifen (wenn einige JS immer noch nicht fertig ist).