使用刷新页面 Selenium 网络驱动程序
在对基于 Web 的应用程序进行自动化测试时,有时需要多次刷新页面才能完全加载所有 Web 元素。首次页面加载时,可能只加载了部分 Web 元素,而需要第二次页面刷新才能显示所有元素。这可以通过提供的刷新命令来实现。 Selenium WebDriver。
如何刷新页面 Selenium
浏览器刷新操作可以使用以下方式执行 Selenium。我们将在整篇文章中详细讨论下面提到的方法。
- driver.navigate().refresh() 命令
- 获取方法
- 发送按键命令
- Navigate 方法
- driver.navigate().to() 命令
1) driver.navigate().refresh() 命令
这是由提供的用于执行页面刷新操作的内置方法。 Selenium WebDriver。此命令是自动化测试中最常用的命令,用于执行页面刷新操作。刷新命令的使用方法如下所述。
driver.get("https://demo.guru99.com/selenium/guru99home/");
driver.navigate().refresh();
导航接口用于执行各种浏览器操作,例如导航到上一页、导航到下一页、页面刷新和关闭浏览器。可以使用 `driver.navigate()` 命令访问导航接口的方法。导航接口的刷新方法不接受任何参数,也不返回任何值。
计费示例:
测试场景:
- 打开Chrome浏览器并输入网页 https://demo.guru99.com/selenium/guru99home/
- 页面加载成功后,使用 driver.navigate().refresh() 方法刷新网页。
- 使用 driver.close() 方法关闭浏览器
Code
package Guru99Demo; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class RefreshDemo { public static void main(String args[]) throws InterruptedException { System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.get("https://demo.guru99.com/selenium/guru99home/"); driver.manage().window().maximize(); driver.navigate().refresh(); driver.close(); } }
⚠️ 版本说明: Selenium 管理器随附 Selenium 4.6 并会自动下载匹配的浏览器驱动程序,因此在当前版本中不再需要上面的 System.setProperty 行代码。 new ChromeDriver() 这就足够了。保留原行是因为它对于……仍然是正确的。 Selenium 3 样式设置,示例是针对这种设置编写的。
Code 输出:
初始页面加载时,演示主页的渲染效果如下所示。
页面刷新操作后,页面上的视频发生了变化,这证实了页面确实重新加载了。
刷新页面的其他几种方法
刷新并非重新加载页面的唯一途径。以下四种方法也能达到同样的效果,值得了解,因为某些锁定的应用程序或顽固的浏览器有时会阻止其中一种方法生效。
2) 获取方法
可以使用递归方式调用 get 方法来刷新页面。为了实现这一点,我们需要将另一个方法作为参数传递给 get 方法。
计费示例:
driver.get("https://www.guru99.com");
driver.get(driver.getCurrentUrl());
3)导航方法
此方法使用了与上述相同的递归概念。getCurrentUrl() 方法作为参数传递给 driver.navigate().to() 方法。
计费示例:
driver.get("https://www.guru99.com");
driver.navigate().to(driver.getCurrentUrl());
4) 使用 F5 键发送按键的方法
这是刷新页面的第二种最常用的方法 Selenium它接受刷新键(F5)作为 sendKeys 方法的参数。由于 sendKeys 只能作用于网页元素而非浏览器,因此我们必须先在网页上找到一个有效的网页元素,然后再使用 sendKeys 方法。这可以通过如下所示的方式实现。
计费示例:
driver.get("https://www.guru99.com"); driver.findElement(By.id("username")).sendKeys(Keys.F5);
由于按键操作是传递给某个元素而不是浏览器窗口,因此这种路由方式依赖于该元素是否拥有焦点。如果 定位器 匹配到无法获得焦点的字段,键会被吞掉,页面永远不会重新加载。
5) 使用 ASCII 发送密钥的方法 Code
此方法与上述方法原理相同,但不同之处在于,它不是传递 F5 键作为参数,而是传递刷新键的代码点作为参数。具体实现方式如下所示。
driver.get("https://www.guru99.com"); driver.findElement(By.id("username")).sendKeys("\uE035");
值 \uE035 是 WebDriver Unicode 代码点,该协议将其映射到 F5,因此此代码片段与前一个代码片段等效。
如何使用刷新页面 Java脚本执行器
每个浏览器都向页面脚本公开了重新加载函数, Selenium 可以通过以下方式呼叫它 Javascript执行器接口。当 WebDriver 刷新命令被应用程序或浏览器扩展程序拦截时,通常会使用这种回退方式。
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("location.reload();");
有两种变体值得记住:
- location.reload() 执行正常页面重新加载,并可能从缓存中提供页面。
- history.go(0) 是某些旧版套件仍在使用的较旧版本。
执行器路由在页面内部运行,因此它不会自行等待新文档。请像在 `driver.navigate().refresh()` 之后一样,显式地等待新文档加载完毕。请记住,脚本驱动的页面重新加载不会清除浏览器级别的对话框。如果被测应用程序异步加载其内容,则需要注意以下事项: 处理 AJAX 调用 Selenium 网络驱动程序.
如何避免刷新后出现 StaleElementReferenceException 异常
页面刷新会销毁当前的 DOM 并构建一个新的 DOM。刷新前捕获的每个 WebElement 现在都指向一个已不存在的节点,因此对它们的下一次调用会抛出 StaleElementReferenceException 异常。这是页面刷新后最常见的错误。
三个习惯几乎可以消除所有这些失败:
- 定位在之后,而不是之前。 存储 By 定位器而不是 WebElement,并在重新加载完成后再次调用 findElement。
- 等待真正的信号。 对于仅在重新加载后才存在的元素,显式等待其可见性比固定的睡眠时间可靠得多。
- 刷新页面,然后重新阅读。 永远不要将重新加载之前捕获的文本值或属性带入重新加载之后进行的断言中。
以下模式适用于所有三种情况:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); driver.navigate().refresh(); WebElement search = wait.until( ExpectedConditions.visibilityOfElementLocated(By.id("username"))); search.sendKeys("guru99");
WebDriverWait 需要一个 Duration 参数。 Selenium 4,这与之前使用的整数秒构造函数有所不同 Selenium 3. 针对这些故障的更广泛技术,请参阅我们的指南。 异常处理 Selenium.
相对比 Selenium 页面刷新方法
这六个命令都会重新加载页面,但它们所依赖的内容以及失败的方式各不相同。
| 付款方式 | 依赖于取决于 | 通过重新加载 | 当这是正确的选择时 |
|---|---|---|---|
| driver.navigate().refresh() | 没什么多余的 | 浏览器重新加载命令 | 几乎总是——默认值 |
| driver.get(driver.getCurrentUrl()) | 可读电流 URL | 全新的导航 | 当你还想删除历史记录条目时 |
| driver.navigate().to(driver.getCurrentUrl()) | 可读电流 URL | 全新的导航 | 与上述相同,通过导航界面编写。 |
| sendKeys(Keys.F5) | 可聚焦元素 | 一次按键 | 当你故意测试键盘路径时 |
| sendKeys(“\uE035”) | 可聚焦元素 | 一次按键 | 与 F5 相同,以代码点的形式编写。 |
| Javascript执行器位置.reload() | 已启用脚本功能 | 页面脚本 | 当 WebDriver 命令被阻塞时 |
首先执行刷新命令,只有当刷新失败且原因明确时,才考虑使用其他行。同样的优先级顺序也适用于以下情况: 最大化或调整浏览器窗口大小优先使用原生 WebDriver 调用,并将脚本路由视为备用方案。


