Search code examples
phpseleniumxpathbehat

How to get the Xpath in behat selenium


Trying to find Xpath in a page. here's my code.

   $session = $this->getSession();
   $found = $session->getPage()->findAll('xpath', '//meta[@name ="description"]/@content');
   if (is_null($found)) {
      throw new \Exception(sprintf("Could not find meta %s='%s' with '%s'",));
   }

giving error

invalid selector: The result of the xpath expression "//html//meta[@name ="description"]/@content" is: [object Attr]. It should be an element. (Session info: chrome=51.0.2704.103) (Driver info: chromedriver=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform=Mac OS X 10.10.5 x86_64) (WARNING: The server did not provide any stacktrace information)


Solution

  • Using '@content' will return the attribute content, this might not return a valid selector when Behat is translating to xpath.

    If you need to specify that attribute you should use it like this:

    //meta[@name ="description"][@content]
    

    Also please note that findAll returns array and not a single element, you can use find to find the first element matching the selector given.

    If you need to get a value of an attribute or to get the text you can use methods like getAttribute('attribute_name') or getText().

    In your case you can have something like:

    $found->getAttribute('name');
    

    or

    $found->getText();