Переключить IFrame с Codeception, используя ID

Как я могу переключиться на IFrame с Codeception, используя ID? На самом деле я могу использовать имя IFrame, но не идентификатор -> 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 не хотят работать вместе. Мой код восприятия

accept.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
  • ОС: Виндовс 10
  • PHP: 7.1.7
  • PHPUnit: 6.4.4
  • Селен-сервер: 3.8.1
  • Кодецепция: 2.3.7
  • Хром: 63.0.3239.108

person eknej    schedule 19.12.2017    source источник
comment
Ты пытался? На самом деле это должно работать, потому что он сводится к этому методу, который говорит имя или идентификатор -› L58-L72" rel="nofollow noreferrer">github.com/facebook/php-webdriver/blob/   -  person Naktibalda    schedule 19.12.2017
comment
Да, вы правы, но метод switchToIFrame связан с AcceptanceTesterActions.php и в этом файле записан в строке 2524: Codeception\Step\Action('switchToIFrame', func_get_args())); }   -  person eknej    schedule 20.12.2017
comment
И что? вы смотрите на самую поверхность.   -  person Naktibalda    schedule 20.12.2017
comment
Проблема в том, что Codeception не ссылается на веб-драйвер Facebook. Они не знают друг друга. Как я могу соединить эти две библиотеки?   -  person eknej    schedule 20.12.2017
comment
Я уверен, что да, ничего бы не работало, если бы они не были связаны.   -  person Naktibalda    schedule 20.12.2017
comment
На этом изображении вы можете увидеть некоторые работы, а некоторые нет.   -  person eknej    schedule 20.12.2017
comment
Это совершенно другая проблема. Скорее всего, причина в том, что в этом пакете не включен WebDriver. Если это так, то запуск сборки codecept должен решить проблему.   -  person Naktibalda    schedule 20.12.2017
comment
Проблема в том, что chromedriver вообще не работает? И получение предупреждения «метод не найден» в PHPStorm не обязательно означает, что что-то не так с кодом, это также может быть связано с настройкой PHPStorm.   -  person Aaron Wallentine    schedule 06.01.2018


Ответы (2)


У меня была эта проблема, когда я тестировал страницу с Google reCaptcha... reCaptcha находится в своем собственном iframe, и, поскольку этот iframe генерируется сторонним кодом, мы не можем контролировать его атрибут имени (по крайней мере, когда он первый созданный).

В итоге я запустил фрагмент javascript, который может найти iframe на основе других вещей, а затем присвоил ему идентификатор, чтобы 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 внутри этого элемента: $('.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

NB, я использую тестовые ключи reCaptcha, как указано здесь, в тестовой среде, чтобы он никогда не запрашивал решение капчи.

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

Со следующими тестовыми ключами вы всегда будете получать No CAPTCHA, и все запросы на проверку будут проходить.

Ключ сайта: 6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI Секретный ключ: 6LeIxAcTAAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe Виджет reCAPTCHA покажет предупреждение о том, что он предназначен только для целей тестирования. Пожалуйста, не используйте эти ключи для рабочего трафика.

person Aaron Wallentine    schedule 06.01.2018
comment
Для случаев, когда JQuery недоступен и предполагается, что есть только 1 iframe для таргетинга: document.getElementsByTagName('iframe')[0].setAttribute('name', '$frameName') - person Thomas Vangelooven; 12.05.2020

Во-первых, в вашем случае проблема может заключаться в том, что вы не звоните приемному тестировщику. Вы должны начать свой скрипт с этого:

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

Теперь, чтобы войти в IFrame в Codeception с помощью WebDriver:

Вам просто нужно назвать IFrame в строке, используя ЛИБО ID или имя. Вот пример:

Есть страница с IFrame:

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

Этот IFrame содержит строку «Никто не знает, кто обнаружил воду», а родительский фрейм — нет. Я тестировал этот Cept с PhantomJS и Selenium.

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

Скриншот кода

person John Dee    schedule 26.12.2017
comment
Я просто хочу переключиться на Iframe с помощью ID. Когда я использую $I-›click('#ID'); codeception находит iframe, проблем нет (и щелчки). Но на следующем этапе codeception не может найти элемент, когда я хочу щелкнуть элемент в этом фрейме, потому что я не перешел на фрейм. Я пересмотрел свой пост с необходимой информацией. - person eknej; 02.01.2018