Норка / бейт, iframe без идентификатора / имени

Я должен проверить текст / сообщения внутри iframe без имени / идентификатора. После изучения я обнаружил, что решение добавить идентификатор / имя и использовать switchToIFrame(идентификатор / имя). Как я могу установить идентификатор / имя для элемента узла в норке? SetAttribute() не поддерживается методом в nodelement, а setValue() не поддерживается для фрейма.

<html>
  <body>
    <div class="div1">
    <iframe class="xyz">
      <!DOCTYPE html>
      <html>
        <body>
          <div class="frame"></div>
          <p>The paragraph1</p>
        </body>
       </html>
  </body>
</html>

Мой контекстный файл

public function iShouldSeeDescription($arg1)
{
    $expected = "The paragraph1";
    $iframe=$this->getSession ()->getPage ()->find ( 'xpath', '//div[contains(@class,"div1")]/iframe[contains(@class,"xyz")]');
    $iframe->setAttribute('id', 'iframe_id');
    $iframeId = $iframe->getAttribute('id');
    $this->getSession()->switchToIframe("$iframeId");
    $actual = $this->getSession()->getPage()->find('xpath', '//div[@class="frame"]/p[1]');
    if ($actual === null) {
        throw new \InvalidArgumentException ( sprintf ( 'null:%s', $arg1 ) );
    }
    if (!($actual === $expected)) {
        throw new \InvalidArgumentException ( sprintf ( 'The Acutal description:%s and expected description:%s did not match ', $actual, $expected ) );
    }

}

2 ответа

То, что вы можете сделать для установки id/name в iframe, это использовать javascript.

Создайте метод, подобный switchToIFrameBySelector($iframeSelector), который ждет, пока данный элемент станет доступным, затем вы можете выполнить код javascript, чтобы задать имя / идентификатор для вашего iframe и после использования метода switchToIFrame.

Для выполнения js-скрипта вы можете использовать метод executeScript в try-catch и, если необходимо, сгенерировать пользовательское исключение.

public function switchToIFrame($iframeSelector){

        $function = <<<JS
            (function(){
                 var iframe = document.querySelector("$iframeSelector");
                 iframe.name = "iframeToSwitchTo";
            })()
JS;
        try{
            $this->getSession()->executeScript($function);
        }catch (Exception $e){
            print_r($e->getMessage());
            throw new \Exception("Element $iframeSelector was NOT found.".PHP_EOL . $e->getMessage());
        }

        $this->getSession()->getDriver()->switchToIFrame("iframeToSwitchTo");
    }

Другой способ установить id / имя элемента в js - использовать:

setAttribute('name', 'iframeToSwitchTo')

Поставить число или цикл for, чтобы повторить, какой из них требуется, затем установить число работает с перекрестным источником

$ This->getSession()->getDriver()->switchToIFrame(0);

Другие вопросы по тегам