2017-12-19 6 views
1

Wie kann ich zu einem IFrame mit Codeception mit ID wechseln? Eigentlich kann ich den Namen des IFrame verwenden, aber nicht die ID ->Codeception SwitchToIFrameSwitch IFrame mit Codeception mit ID

IFrame Beispiel:

<iframe id="iframeToolbar" src="link" frameborder="0" style="position: fixed; left: 0px; top: 0px; z-index: 998; width: 940px;" scrolling="no" width="100px" height="100%"></iframe> 

Codeception Beispiel:

<?php 
# switch to iframe 
$I->switchToIFrame("another_frame"); 
# switch to parent page 
$I->switchToIFrame(); 

Ist es vielleicht ein Codeception < -> Facebook WebDriver Verbindungsproblem?

BEARBEITEN: Ich installierte Codeception erneut, folgte dem Quick Step Guide. Ergebnis - das Problem ist immer noch das gleiche: Codeception und der Facebook Webdriver wollen nicht zusammenarbeiten. My Codeception Code

acceptance.suite.yml:

actor: AcceptanceTester 
modules: 
    enabled: 
    - \Helper\Acceptance 
    - WebDriver: 
      url: https://xxxxxxxxxxxxxx.com 
      browser: chrome 
      window_size: maximize 
      clear_cookies: true 

codeception.yml:

paths: 
tests: tests 
output: tests/_output 
data: tests/_data 
support: tests/_support 
envs: tests/_envs 
actor_suffix: Tester 
extensions: 
enabled: 
    - Codeception\Extension\RunFailed 
settings: 
colors: true 
  • OS: Windows 10
  • PHP: 7.1.7
  • PHPUnit: 6.4. 4
  • Selenserver: 3.8.1
  • Codeception: 2.3.7
  • Chrome: in Ihrem Fall 63.0.3239.108
+0

Haben Sie es versucht? Eigentlich sollte es funktionieren, denn es geht um diese Methode, die sagt "Name oder ID" -> https://github.com/facebook/php-webdriver/blob/62223d89bcdd4f755a62b2fbc193122e880c41fc/lib/Remote/RemoteTargetLocator.php#L58-L72 – Naktibalda

+0

Ja, Sie haben recht, aber die switchToIFrame-Methode ist mit AcceptanceTesterActions.php verknüpft und in dieser Datei wird in Zeile 2524 geschrieben: public function switchToIFrame ($ name = null) { return $ this-> getScenario() -> runStep (neue \ Codeception \ Step \ Action ('switchToIFrame', func_get_args())); } – eknej

+0

also was? du schaust auf die Oberfläche. – Naktibalda

Antwort

1

ich dieses Problem hatte, eine Seite mit einem Google reCaptcha darin zu testen ... die reCaptcha in seinem eigenen iframe ist, und da das iframe durch 3rd-Party-Code generiert, wir habe keine Kontrolle über sein Namensattribut (zumindest wenn es zuerst generiert wurde).

Was landete ich tun wurde ein JavaScript-Snippet ausgeführt wird, die die Iframe basierend auf andere Dinge finden, und es dann eine ID zu geben, so dass Codeception WebDriver schalten konnte:

public function _clickOnCaptcha(AcceptanceTester $I) 
{ 
    // give the recaptcha iframe a name so codeception webdriver can switch to it 
    $recaptcha_frame_name = 'recaptcha-frame'; 
    $I->executeJS("$('.g-recaptcha iframe').attr('name', '$recaptcha_frame_name')"); 
    $I->switchToIFrame($recaptcha_frame_name); 
    $I->see('not a robot'); 
    $I->seeElement('.rc-anchor'); 
    $I->click(['id' => 'recaptcha-anchor']); 
    $I->switchToIFrame(); // switch back to main window 
} 

ich hatte Kontrolle über die enthaltenden Elemente, so in diesem Fall ist es in einem Element mit der Klasse g-recaptcha enthalten ... so verwenden wir jquery, um den iframe innerhalb dieses Elements zu finden: $('.g-recaptcha iframe'), und geben Sie dann ein Namensattribut: .

Dann können wir Codeception verwenden, um es zu wechseln und das Captcha Checkbox klicken: $I->switchToIFrame($recaptcha_frame_name); $I->click(['id' => 'recaptcha-anchor']);

Dann, wenn wir fertig sind, schalten Sie zurück an den Hauptrahmen so können wir unser Formular einreichen: $I->switchToIFrame(); // switch back to main window

NB, ich benutze die ReCaptcha-Testschlüssel, wie hier angegeben, in der Testumgebung, so dass sie nie wirklich nach einem Captcha fragen wird.

https://developers.google.com/recaptcha/docs/faq

Mit den folgenden Test Tasten, werden Sie immer kein CAPTCHA erhalten und alle werden Verifikationsanforderungen bestehen.

Site-Schlüssel: 6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI Geheimschlüssel: 6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe Der reCAPTCHA-Widget eine Warnmeldung wird zu behaupten, dass es nur zu Testzwecken ist. Bitte verwenden Sie diese Schlüssel nicht für Ihren Produktionsverkehr.

+0

Das ist brilliant, danke. – eknej

0

Zunächst einmal könnte das Problem sein, dass Sie nicht die Akzeptanz Tester sind aufrufen. Sie sollten Ihr Skript mit dieser beginnen:

<?php 
$I = /*am a */ new AcceptanceTester($scenario); 

nun in einen IFrame in Codeception erhalten mit den WebDriver:

Sie haben soeben die IFrame in einem String-Namen zu verwenden ENTWEDER die ID oder die Name. Hier ein Beispiel:

Es gibt eine Seite mit dem IFrame ist:

<iframe name = "IFrameByName" id = "IFrameByID" width = "500" height = "300" src = "https://messagetothefish.com"></iframe> 

Diese IFrame enthält die Zeichenfolge „Niemand weiß, wer Wasser entdeckte“, aber der übergeordnete Rahmen nicht. Ich habe dieses Cept mit PhantomJS und Selen getestet.

<?php 

$I = /*am a */ new AcceptanceTester($scenario); 

$I->wantTo('See how Iframes work'); 
$I->amOnUrl("https://wordpress-bdd.com/codeception-iframe/"); 
$I->dontSee("No one knows who discovered water"); 

//Switch by name 
$I->switchToIFrame("IFrameByName"); 
$I->see("No one knows who discovered water"); 

//switch back to parent 
$I->switchToIFrame(); 
$I->dontSee("No one knows who discovered water"); 

//Switch by ID 
$I->switchToIFrame("IFrameByID"); 
$I->see("No one knows who discovered water"); 
$I->dontSee('Lorum Ipsum'); 

//switch back to parent 
$I->switchToIFrame(); 
$I->dontSee("No one knows who discovered water"); 

Codeception Screenshot

+0

Ich möchte nur zu einem Iframe mit ID wechseln. Wenn ich $ I-> klicke ('# ID'); Codeception findet den Iframe, es gibt kein Problem (und Klicks). Aber im nächsten Schritt kann die Codeception das Element nicht finden, wenn ich auf ein Element in diesem Frame klicken möchte - weil ich nicht zum Frame gewechselt bin. Ich habe meine Post mit den benötigten Informationen überarbeitet. – eknej