Норка / бейт, 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);