我必须验证iframe中没有名称/ ID的文本/消息。在探索之后,我发现了添加id / name并使用switchToIFrame(id / name)的解决方案。如何在貂皮中为节点元素设置id / name? 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 ) );
}
}
答案 0 :(得分:5)
将ID /名称设置为iframe可以使用javascript。
创建一个类似switchToIFrameBySelector($ iframeSelector)的方法,等待给定元素可用,然后您可以执行javascript代码来设置iframe的名称/ ID以及使用switchToIFrame方法后。
为了执行js脚本,您可以在try-catch中使用executeScript方法,并在需要时抛出自定义异常。
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");
}
在js中设置元素的id / name的另一种方法是使用:
setAttribute('name', 'iframeToSwitchTo')
答案 1 :(得分:0)
使用数字或for循环迭代需要哪一个然后设置数字与十字原点一起使用
$这 - &GT;的getSession() - &GT; getDriver() - &GT; switchToIFrame(0);