使用ID切换IFrame与Codeception

时间:2017-12-19 15:36:47

标签: selenium iframe codeception

如何使用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>

Codeception示例:

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

它可能是一个Codeception&lt; - &gt; 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
  • 操作系统:Windows 10
  • PHP:7.1.7
  • PHPUnit:6.4.4
  • Selenium Server:3.8.1
  • Codeception:2.3.7
  • Chrome:63.0.3239.108

2 个答案:

答案 0 :(得分:2)

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

我最终做的是运行一个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
}

我确实控制了包含元素,因此在这种情况下,它包含在具有类g-recaptcha的元素中...所以我们使用jquery在该元素中找到iframe:{{ 1}},然后给它一个名称属性:$('.g-recaptcha iframe')

然后我们可以使用Codeception切换到它并单击captcha复选框: .attr('name', '$recaptcha_frame_name')

然后,当我们完成后,切换回主框架,以便我们提交表单: $I->switchToIFrame($recaptcha_frame_name); $I->click(['id' => 'recaptcha-anchor']);

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

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

  

使用以下测试键,您将始终获得No CAPTCHA并且所有验证请求都将通过。

     
    

站点密钥:6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI     密钥:6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe     reCAPTCHA小部件将显示一条警告消息,声称它仅用于测试目的。请不要将这些密钥用于生产流量。

  

答案 1 :(得分:0)

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

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

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

您只需使用 EITHER ID 名称将字符串命名为字符串。这是一个例子:

有一个包含IFrame的页面:

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

此IFrame包含字符串,“没有人知道是谁发现了水”,但父框架没有。我用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");

Codeception Screenshot