driver.get() 到底是做什么的?

What exactly does driver.get() do?

WebDriver documentationdriver.get() 操作声明如下:

Dependent on several factors, including the OS/Browser combination, WebDriver may or may not wait for the page to load. In some circumstances, WebDriver may return control before the page has finished, or even started, loading

任何人都可以解释在什么情况下 WebDriver returns 控制在页面完成之前,甚至开始加载?

这取决于您使用的 WebDriver。

在几乎每个 WebDriver 中,控制都是在文档加载后给出的。这意味着 onDocumentReady JavaScript 回调可能尚未完成。

要避免这种情况,您可以使用带有合适谓词的 WebDriverWait 或 FluentWait。

A Thread.sleep() 也是可以的,但是比较脏!

在一个简单的表单中,.get() 将您导航到 URL。

Can anyone explain under what circumstances WebDriver returns control before the page has finished, or even started, loading?

这种情况现在很常见 - 越来越多的页面异步加载。 Selenium 不会等待对未完成的 AJAX 请求或当前 运行 脚本的响应,这些脚本在尝试访问 DOM 中不存在或尚不可见的元素时可能会导致不同的错误,或者还没有所需的数据。

顺便说一句,这是 protractor package 专门为 AngularJS 应用程序测试而存在的原因之一 - 它监听 angular 以发出信号 [=54] =].

有多种方法可以等待页面加载:

  • 增加"Page load timeout"(不太可靠)
  • wait for a DOM readyState to complete
  • explicitly wait for a specific element 出现在 DOM 或可见 - 这种方法是最常见和最可靠的

这是一个 perfect answer,应该有助于清理问题。

另请参阅相关主题,对问题进行一些很好的解释:

  • Wait for page load in Selenium
  • How I can check whether a page is loaded completely or not in web driver?
  • Selenium WebDriver : Wait for complex page with JavaScript(JS) to load