/ResqueBoard2/vendor/behat/mink/src/Behat/Mink/Selector/NamedSelector.php

https://bitbucket.org/galvani/flow-resque-board · PHP · 112 lines · 75 code · 10 blank · 27 comment · 6 complexity · 4711ac647a2c2d14bfed560f1ec2e89d MD5 · raw file

  1. <?php
  2. namespace Behat\Mink\Selector;
  3. /*
  4. * This file is part of the Behat\Mink.
  5. * (c) Konstantin Kudryashov <ever.zet@gmail.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. /**
  11. * Named selectors engine. Uses registered XPath selectors to create new expressions.
  12. *
  13. * @author Konstantin Kudryashov <ever.zet@gmail.com>
  14. */
  15. class NamedSelector implements SelectorInterface
  16. {
  17. private $selectors = array(
  18. 'fieldset' => <<<XPATH
  19. .//fieldset[(./@id = %locator% or .//legend[contains(normalize-space(string(.)), %locator%)])]
  20. XPATH
  21. ,'field' => <<<XPATH
  22. .//*[self::input | self::textarea | self::select][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'hidden')][(((./@id = %locator% or ./@name = %locator%) or ./@id = //label[contains(normalize-space(string(.)), %locator%)]/@for) or ./@placeholder = %locator%)] | .//label[contains(normalize-space(string(.)), %locator%)]//.//*[self::input | self::textarea | self::select][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'hidden')]
  23. XPATH
  24. ,'link' => <<<XPATH
  25. .//a[./@href][(((./@id = %locator% or contains(normalize-space(string(.)), %locator%)) or contains(./@title, %locator%) or contains(./@rel, %locator%)) or .//img[contains(./@alt, %locator%)])] | .//*[./@role = 'link'][((./@id = %locator% or contains(./@value, %locator%)) or contains(./@title, %locator%) or contains(normalize-space(string(.)), %locator%))]
  26. XPATH
  27. ,'button' => <<<XPATH
  28. .//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][(((./@id = %locator% or ./@name = %locator%) or contains(./@value, %locator%)) or contains(./@title, %locator%))] | .//input[./@type = 'image'][contains(./@alt, %locator%)] | .//button[((((./@id = %locator% or ./@name = %locator%) or contains(./@value, %locator%)) or contains(normalize-space(string(.)), %locator%)) or contains(./@title, %locator%))] | .//input[./@type = 'image'][contains(./@alt, %locator%)] | .//*[./@role = 'button'][(((./@id = %locator% or ./@name = %locator%) or contains(./@value, %locator%)) or contains(./@title, %locator%) or contains(normalize-space(string(.)), %locator%))]
  29. XPATH
  30. ,'link_or_button' => <<<XPATH
  31. .//a[./@href][(((./@id = %locator% or contains(normalize-space(string(.)), %locator%)) or contains(./@title, %locator%) or contains(./@rel, %locator%)) or .//img[contains(./@alt, %locator%)])] | .//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][((./@id = %locator% or contains(./@value, %locator%)) or contains(./@title, %locator%))] | .//input[./@type = 'image'][contains(./@alt, %locator%)] | .//button[(((./@id = %locator% or contains(./@value, %locator%)) or contains(normalize-space(string(.)), %locator%)) or contains(./@title, %locator%))] | .//input[./@type = 'image'][contains(./@alt, %locator%)] | .//*[(./@role = 'button' or ./@role = 'link')][((./@id = %locator% or contains(./@value, %locator%)) or contains(./@title, %locator%) or contains(normalize-space(string(.)), %locator%))]
  32. XPATH
  33. ,'content' => <<<XPATH
  34. ./descendant-or-self::*[contains(normalize-space(.), %locator%)]
  35. XPATH
  36. ,'select' => <<<XPATH
  37. .//select[(((./@id = %locator% or ./@name = %locator%) or ./@id = //label[contains(normalize-space(string(.)), %locator%)]/@for) or ./@placeholder = %locator%)] | .//label[contains(normalize-space(string(.)), %locator%)]//.//select
  38. XPATH
  39. ,'checkbox' => <<<XPATH
  40. .//input[./@type = 'checkbox'][(((./@id = %locator% or ./@name = %locator%) or ./@id = //label[contains(normalize-space(string(.)), %locator%)]/@for) or ./@placeholder = %locator%)] | .//label[contains(normalize-space(string(.)), %locator%)]//.//input[./@type = 'checkbox']
  41. XPATH
  42. ,'radio' => <<<XPATH
  43. .//input[./@type = 'radio'][(((./@id = %locator% or ./@name = %locator%) or ./@id = //label[contains(normalize-space(string(.)), %locator%)]/@for) or ./@placeholder = %locator%)] | .//label[contains(normalize-space(string(.)), %locator%)]//.//input[./@type = 'radio']
  44. XPATH
  45. ,'file' => <<<XPATH
  46. .//input[./@type = 'file'][(((./@id = %locator% or ./@name = %locator%) or ./@id = //label[contains(normalize-space(string(.)), %locator%)]/@for) or ./@placeholder = %locator%)] | .//label[contains(normalize-space(string(.)), %locator%)]//.//input[./@type = 'file']
  47. XPATH
  48. ,'optgroup' => <<<XPATH
  49. .//optgroup[contains(./@label, %locator%)]
  50. XPATH
  51. ,'option' => <<<XPATH
  52. .//option[(./@value = %locator% or contains(normalize-space(string(.)), %locator%))]
  53. XPATH
  54. ,'table' => <<<XPATH
  55. .//table[(./@id = %locator% or contains(.//caption, %locator%))]
  56. XPATH
  57. );
  58. /**
  59. * Registers new XPath selector with specified name.
  60. *
  61. * @param string $name name for selector
  62. * @param string $xpath xpath expression
  63. */
  64. public function registerNamedXpath($name, $xpath)
  65. {
  66. $this->selectors[$name] = $xpath;
  67. }
  68. /**
  69. * Translates provided locator into XPath.
  70. *
  71. * @param string|array $locator selector name or array of (selector_name, locator)
  72. *
  73. * @return string
  74. *
  75. * @throws \InvalidArgumentException
  76. */
  77. public function translateToXPath($locator)
  78. {
  79. if (2 < count($locator)) {
  80. throw new \InvalidArgumentException('NamedSelector expects array(name, locator) as argument');
  81. }
  82. if (2 == count($locator)) {
  83. $selector = $locator[0];
  84. $locator = $locator[1];
  85. } else {
  86. $selector = (string) $locator;
  87. $locator = null;
  88. }
  89. if (!isset($this->selectors[$selector])) {
  90. throw new \InvalidArgumentException(sprintf(
  91. 'Unknown named selector provided: "%s". Expected one of (%s)',
  92. $selector,
  93. implode(', ', array_keys($this->selectors))
  94. ));
  95. }
  96. $xpath = $this->selectors[$selector];
  97. if (null !== $locator) {
  98. $xpath = strtr($xpath, array('%locator%' => $locator));
  99. }
  100. return $xpath;
  101. }
  102. }