使用 ID 使用 Codeception 切换 IFrame

Switch IFrame with Codeception using ID

如何使用 ID 切换到带有 Codeception 的 IFrame?实际上我可以使用 IFrame 的名称但不能使用 ID -> Codeception SwitchToIFrame

IFrame 示例:

<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>

解码示例:

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

可能是 Codeception <-> Facebook Webdriver 连接问题?

编辑:我按照快速步骤指南重新安装了 Codeception。结果 - 问题仍然相同:Codeception 和 Facebook Webdriver 不想一起工作。 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

首先,在您的情况下,问题可能是您没有调用验收测试人员。你应该用这个开始你的脚本:

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

现在使用 WebDriver 进入 Codeception 中的 IFrame:

您只需使用 EITHER IDname[= 在字符串中命名 IFrame 30=]。这是一个例子:

有一个带有 IFrame 的页面:

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

此 IFrame 包含字符串,"No one knows who discovered water" 但父框架不包含。我用 PhantomJS 和 Selenium 测试了这个 Cept。

<?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");

我遇到了这个问题,正在测试一个包含 Google reCaptcha 的页面...reCaptcha 在它自己的 iframe 中,并且由于该 iframe 是由第 3 方代码生成的,我们无法控制在其名称属性上(至少在首次生成时)。

我最后做的是 运行 一个 javascript 片段,它可以根据其他东西找到 iframe,然后给它一个 id,这样 Codeception Webdriver 就可以切换到它:

    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
}

我确实控制了包含的元素,所以在这种情况下,它包含在带有 class g-recaptcha 的元素中...所以我们使用 jquery 来查找 iframe在那个元素里面:$('.g-recaptcha iframe'),然后给它一个名称属性:.attr('name', '$recaptcha_frame_name').

然后我们可以使用Codeception切换到它并点击验证码复选框: $I->switchToIFrame($recaptcha_frame_name); $I->click(['id' => 'recaptcha-anchor']);

然后,当我们完成后,切换回主框架,以便我们可以提交表单: $I->switchToIFrame(); // switch back to main window

注意,我在测试环境中使用此处指定的 reCaptcha 测试密钥,因此它永远不会真正要求解决验证码问题。

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

With the following test keys, you will always get No CAPTCHA and all verification requests will pass.

Site key: 6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI Secret key: 6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe The reCAPTCHA widget will show a warning message to claim that it's only for testing purposes. Please do not use these keys for your production traffic.