BrowserExtension.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. } catch (TimeoutException $e) {
  51. $callback && $callback();
  52. }
  53. return $this;
  54. },
  55. 'assertHidden' => function ($selector) {
  56. $fullSelector = $this->resolver->format($selector);
  57. PHPUnit::assertTrue(
  58. $this->resolver->findOrFail($selector)->isDisplayed(),
  59. "Element [{$fullSelector}] is visible."
  60. );
  61. return $this;
  62. },
  63. 'assert' => function (Component $component) {
  64. return $this->with($component, function () {});
  65. },
  66. ];
  67. foreach ($functions as $method => $callback) {
  68. Browser::macro($method, $callback);
  69. }
  70. }
  71. public function makeDelayBrowser($browser)
  72. {
  73. return new class($browser) {
  74. protected $browser;
  75. protected $callbacks = [];
  76. public function __construct(Browser $browser)
  77. {
  78. $this->browser = $browser;
  79. }
  80. public function __call($method, $arguments = [])
  81. {
  82. $this->callbacks[] = [
  83. 'method' => $method,
  84. 'arguments' => $arguments,
  85. ];
  86. return $this;
  87. }
  88. public function __invoke()
  89. {
  90. $browser = $this->browser;
  91. foreach ($this->callbacks as $value) {
  92. $method = $value['method'];
  93. $browser = $browser->{$method}(...$value['arguments']);
  94. }
  95. return $browser;
  96. }
  97. };
  98. }
  99. }