BrowserExtension.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <?php
  2. namespace Tests;
  3. use Facebook\WebDriver\Exception\TimeoutException;
  4. use Illuminate\Support\Arr;
  5. use Illuminate\Support\Str;
  6. use Laravel\Dusk\Browser;
  7. use Laravel\Dusk\Component;
  8. use PHPUnit\Framework\Assert as PHPUnit;
  9. trait BrowserExtension
  10. {
  11. public function extendBrowser()
  12. {
  13. $functions = [
  14. // 等待文本可见
  15. 'whenTextAvailable' => function ($text, $callbackOrSeconds = null, $seconds = null) {
  16. $callback = null;
  17. if (is_callable($callbackOrSeconds)) {
  18. $callback = $callbackOrSeconds;
  19. } elseif (is_numeric($callbackOrSeconds)) {
  20. $seconds = $callbackOrSeconds;
  21. }
  22. $text = Arr::wrap($text);
  23. $message = $this->formatTimeOutMessage('Waited %s seconds for text', implode("', '", $text));
  24. return $this->waitUsing($seconds, 100, function () use ($text, $callback) {
  25. $results = Str::contains($this->resolver->findOrFail('')->getText(), $text);
  26. if ($results) {
  27. $callback && $callback($this);
  28. }
  29. return $results;
  30. }, $message);
  31. },
  32. // 等待元素可见
  33. 'whenElementAvailable' => function ($selector, $callbackOrSeconds = null, $seconds = null) {
  34. $callback = null;
  35. if (is_callable($callbackOrSeconds)) {
  36. $callback = $callbackOrSeconds;
  37. } elseif (is_numeric($callbackOrSeconds)) {
  38. $seconds = $callbackOrSeconds;
  39. }
  40. return $this->whenAvailable($selector, function ($value) use ($callback) {
  41. $callback && $callback($value);
  42. }, $seconds);
  43. },
  44. // 判断input框是否存在
  45. 'hasInput' => function ($field) {
  46. /* @var \Facebook\WebDriver\Remote\RemoteWebElement $element */
  47. $this->resolver->resolveForTyping($field);
  48. return $this;
  49. },
  50. // 判断元素是否不可见
  51. 'assertHidden' => function ($selector) {
  52. $fullSelector = $this->resolver->format($selector);
  53. $isHidden = $this->script(
  54. <<<JS
  55. var display = $('{$fullSelector}').css('display');
  56. return display === 'none' || $('{$fullSelector}').is(':hidden');
  57. JS
  58. );
  59. PHPUnit::assertTrue(
  60. (bool) ($isHidden[0] ?? false),
  61. "Element [{$fullSelector}] is displayed."
  62. );
  63. return $this;
  64. },
  65. // 判断是否是给定组件
  66. 'is' => function (Component $component) {
  67. return $this->with($component, function () {
  68. });
  69. },
  70. // 判断文本是否存在,忽略大小写
  71. 'assertSeeTextIn' => function (?string $selector, ?string $text) {
  72. $fullSelector = $this->resolver->format($selector);
  73. $element = $this->resolver->findOrFail($selector);
  74. PHPUnit::assertTrue(
  75. Str::contains(strtolower($element->getText()), strtolower($text)),
  76. "Did not see expected text [{$text}] within element [{$fullSelector}]."
  77. );
  78. return $this;
  79. },
  80. // 判断文本是否存在,忽略大小写
  81. 'assertSeeText' => function (?string $text) {
  82. return $this->assertSeeTextIn('', $text);
  83. },
  84. ];
  85. foreach ($functions as $method => $callback) {
  86. Browser::macro($method, $callback);
  87. }
  88. }
  89. public function makeDelayBrowser($browser)
  90. {
  91. return new class($browser) {
  92. protected $browser;
  93. protected $callbacks = [];
  94. public function __construct(Browser $browser)
  95. {
  96. $this->browser = $browser;
  97. }
  98. public function __call($method, $arguments = [])
  99. {
  100. $this->callbacks[] = [
  101. 'method' => $method,
  102. 'arguments' => $arguments,
  103. ];
  104. return $this;
  105. }
  106. public function __invoke()
  107. {
  108. $browser = $this->browser;
  109. foreach ($this->callbacks as $value) {
  110. $method = $value['method'];
  111. $browser = $browser->{$method}(...$value['arguments']);
  112. }
  113. return $browser;
  114. }
  115. };
  116. }
  117. }