2016-07-29 10 views
2

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

<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

Я предполагаю, что это всего лишь метод тестирования, иначе переключитесь на iframe, и проверки должны быть разными шагами, а ожидаемый текст и селектор, содержащий этот текст, должны быть параметрами метода. – lauda

ответ

5

Что вы можете сделать, чтобы установить идентификатор/имя в 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"); 
 
    }

Другой способ установить идентификатор/имя элемента в JS является использование:

setAttribute('name', 'iframeToSwitchTo')

+0

Я нашел это решение из других ответов Stackoverflow. Есть ли способ сделать это в PHP? –

+0

Без использования js/jQuery я так не думаю. Я вижу, что есть метод setValue, который указывает в Selenium2Driver, который также использует js-скрипт. Может быть, нет методов для изменения страницы/элемента, потому что вы должны делать эти изменения, setValue предназначен для установки значения для текстового поля/входы. У вас есть ограничение на использование js? вы должны только взаимодействовать со страницей, а не изменять ее, используя js - это работа для особых обстоятельств. Вы можете поговорить с разработчиком из проекта, чтобы добавить некоторые атрибуты, если это возможно. – lauda

+0

Я постараюсь использовать это решение и увидеть, что проблема будет решена. Я также отправлю свой код после того, как мне это удастся. Спасибо! –

0

поставить номер или для цикла для итерации, которая требуется, тогда установите число работает с крестиком

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