Browser.php 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. * @return $this
  18. */
  19. public function extend($selector, $callback)
  20. {
  21. $browser = new static(
  22. $this->driver, new ElementResolver($this->driver, $this->resolver->format($selector))
  23. );
  24. $browser->parent = $this;
  25. if ($this->page) {
  26. $browser->onWithoutAssert($this->page);
  27. }
  28. if ($selector instanceof Component) {
  29. $browser->onComponent($selector, $this->resolver);
  30. }
  31. call_user_func($callback, $browser);
  32. return $this;
  33. }
  34. public function __call($method, $parameters)
  35. {
  36. $parentComponent = $this->parent ? $this->parent->component : null;
  37. if ($parentComponent && method_exists($parentComponent, $method)) {
  38. array_unshift($parameters, $this);
  39. $parentComponent->{$method}(...$parameters);
  40. return $this;
  41. }
  42. return parent::__call($method, $parameters);
  43. }
  44. }