BrowserExtension.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. 'whenTextAvailable' => function ($text, $callbackOrSeconds = null, $seconds = null) {
  15. $callback = null;
  16. if (is_callable($callbackOrSeconds)) {
  17. $callback = $callbackOrSeconds;
  18. } elseif (is_numeric($callbackOrSeconds)) {
  19. $seconds = $callbackOrSeconds;
  20. }
  21. $text = Arr::wrap($text);
  22. $message = $this->formatTimeOutMessage('Waited %s seconds for text', implode("', '", $text));
  23. return $this->waitUsing($seconds, 100, function () use ($text, $callback) {
  24. $results = Str::contains($this->resolver->findOrFail('')->getText(), $text);
  25. if ($results) {
  26. $callback && $callback($this);
  27. }
  28. return $results;
  29. }, $message);
  30. },
  31. 'whenElementAvailable' => function ($selector, $callbackOrSeconds = null, $seconds = null) {
  32. $callback = null;
  33. if (is_callable($callbackOrSeconds)) {
  34. $callback = $callbackOrSeconds;
  35. } elseif (is_numeric($callbackOrSeconds)) {
  36. $seconds = $callbackOrSeconds;
  37. }
  38. return $this->whenAvailable($selector, function ($value) use ($callback) {
  39. $callback && $callback($value);
  40. }, $seconds);
  41. },
  42. 'hasInput' => function ($field) {
  43. /* @var \Facebook\WebDriver\Remote\RemoteWebElement $element */
  44. $this->resolver->resolveForTyping($field);
  45. return $this;
  46. },
  47. 'wait' => function ($seconds, \Closure $callback = null) {
  48. try {
  49. $this->waitUsing($seconds, 200, function () {
  50. });
  51. } catch (TimeoutException $e) {
  52. $callback && $callback();
  53. }
  54. return $this;
  55. },
  56. 'assertHidden' => function ($selector) {
  57. $fullSelector = $this->resolver->format($selector);
  58. PHPUnit::assertTrue(
  59. $this->resolver->findOrFail($selector)->isDisplayed(),
  60. "Element [{$fullSelector}] is visible."
  61. );
  62. return $this;
  63. },
  64. 'assert' => function (Component $component) {
  65. return $this->with($component, function () {
  66. });
  67. },
  68. ];
  69. foreach ($functions as $method => $callback) {
  70. Browser::macro($method, $callback);
  71. }
  72. }
  73. public function makeDelayBrowser($browser)
  74. {
  75. return new class($browser) {
  76. protected $browser;
  77. protected $callbacks = [];
  78. public function __construct(Browser $browser)
  79. {
  80. $this->browser = $browser;
  81. }
  82. public function __call($method, $arguments = [])
  83. {
  84. $this->callbacks[] = [
  85. 'method' => $method,
  86. 'arguments' => $arguments,
  87. ];
  88. return $this;
  89. }
  90. public function __invoke()
  91. {
  92. $browser = $this->browser;
  93. foreach ($this->callbacks as $value) {
  94. $method = $value['method'];
  95. $browser = $browser->{$method}(...$value['arguments']);
  96. }
  97. return $browser;
  98. }
  99. };
  100. }
  101. }