没有id / name的Mink / behat iframe

时间:2016-07-29 20:43:27

标签: iframe behat mink setattribute

我必须验证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 ) );
    }

}

2 个答案:

答案 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);