Browser.php 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <?php
  2. namespace Tests;
  3. use Laravel\Dusk\Browser as BaseBrowser;
  4. use Laravel\Dusk\Component;
  5. use Laravel\Dusk\ElementResolver;
  6. class Browser extends BaseBrowser
  7. {
  8. /**
  9. * @var static
  10. */
  11. public $parent;
  12. /**
  13. * 作用与 with 方法完全相同,不同的在于此方法可以让下层 Broser 对象继承当前 Component 的方法.
  14. *
  15. * @param string|Component $selector
  16. * @param \Closure $callback
  17. *
  18. * @return $this
  19. */
  20. public function extend($selector, $callback)
  21. {
  22. $browser = new static(
  23. $this->driver, new ElementResolver($this->driver, $this->resolver->format($selector))
  24. );
  25. $browser->parent = $this;
  26. if ($this->page) {
  27. $browser->onWithoutAssert($this->page);
  28. }
  29. if ($selector instanceof Component) {
  30. $browser->onComponent($selector, $this->resolver);
  31. }
  32. call_user_func($callback, $browser);
  33. return $this;
  34. }
  35. public function __call($method, $parameters)
  36. {
  37. $parentComponent = $this->parent ? $this->parent->component : null;
  38. if ($parentComponent && method_exists($parentComponent, $method)) {
  39. array_unshift($parameters, $this);
  40. $parentComponent->{$method}(...$parameters);
  41. return $this;
  42. }
  43. return parent::__call($method, $parameters);
  44. }
  45. }