使用 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
- OS: Windows 10
- PHP: 7.1.7
- PHP单位:6.4.4
- 硒服务器:3.8.1
- 解码:2.3.7
- Chrome: 63.0.3239.108
首先,在您的情况下,问题可能是您没有调用验收测试人员。你应该用这个开始你的脚本:
<?php
$I = /*am a */ new AcceptanceTester($scenario);
现在使用 WebDriver 进入 Codeception 中的 IFrame:
您只需使用 EITHER ID 或 name[= 在字符串中命名 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.
如何使用 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
- OS: Windows 10
- PHP: 7.1.7
- PHP单位:6.4.4
- 硒服务器:3.8.1
- 解码:2.3.7
- Chrome: 63.0.3239.108
首先,在您的情况下,问题可能是您没有调用验收测试人员。你应该用这个开始你的脚本:
<?php
$I = /*am a */ new AcceptanceTester($scenario);
现在使用 WebDriver 进入 Codeception 中的 IFrame:
您只需使用 EITHER ID 或 name[= 在字符串中命名 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.