2016-07-29 4 views
2

iframe 내부의 텍스트/메시지를 이름/ID로 확인해야합니다. 탐구 후, 그 해결책을 찾아 id/name을 추가하고 switchToIFrame (id/name)을 사용합니다. 밍크의 노드 요소에 id/name을 어떻게 설정합니까? SetAttribute()는 nodelement에서 지원되는 메서드가 아니며 setValue()는 프레임에서 지원되지 않습니다.ID/이름이없는 밍크/behat iframe

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

내 상황에 맞는 파일은 iframe을 자바 스크립트를 사용하는 것입니다에 ID/이름을 설정하기 위해 무엇을 할 수 있는지

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

나는 이것이 테스트를위한 방법 일 뿐이고 iframe으로 전환하고 유효성 검사가 다른 단계 여야하며 예상 텍스트와이 텍스트를 포함하는 선택자가 metod의 매개 변수 여야한다고 가정합니다. – lauda

답변

5

입니다.

주어진 요소가 사용 가능할 때까지 기다리는 switchToIFrameBySelector ($ iframeSelector)와 같은 메소드를 작성하면 iframe의 name/id를 설정하고 switchToIFrame 메소드를 사용한 후에 자바 스크립트 코드를 실행할 수 있습니다.

js 스크립트를 실행하려면 try-catch에서 executeScript 메소드를 사용하고 필요한 경우 사용자 정의 Exception을 throw 할 수 있습니다.

+0

다른 Stackoverflow 답변에서이 솔루션을 찾았습니다. PHP에서이 작업을 수행 할 수있는 방법이 있습니까? –

+0

js/jQuery를 사용하지 않고서는 그렇게 생각하지 않습니다. 그 setValue 메소드는 또한 Js script를 사용하는 Selenium2Driver를 가리킨다는 것을 알 수 있습니다. 아마도 이러한 유형의 변경을해서는 안되기 때문에 페이지/요소를 변경할 방법이 없을 수도 있습니다. setValue는 텍스트 필드의 값을 설정하기위한 것입니다./입력. js 사용에 대한 제한이 있습니까? 당신은 페이지와 상호 작용 만하고 변경하지 말아야한다. js는 특별한 상황에 대한 해결 방법이다. 가능한 한 프로젝트의 개발자와 대화하여 가능한 한 몇 가지 속성을 추가해야한다. – lauda

+0

이 솔루션을 사용하고 문제점이 해결되었는지 확인합니다. 내가 성공한 후에도 코드를 게시 할 것입니다. 고맙습니다! –

0

setAttribute('name', 'iframeToSwitchTo')
루프의 번호 나 입력 :

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/이름을 설정하는 또 다른 방법은 사용하는 어느 것을 반복 할 것인가는 십자가 원과 함께 번호가 설정된다

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