使用刷新页面 Selenium 网络驱动程序

⚡ 智能摘要

刷新页面 Selenium WebDriver 重新加载当前页面 URL 这样,每个元素都会在断言运行之前渲染,并且该框架提供了五个不同的命令,以不同的方式实现相同的重新加载。

  • 🔘 默认选项: driver.navigate().refresh() 是内置的重新加载函数,它不接受任何参数,也不返回任何值。
  • ☑️ 递归变体: 将 getCurrentUrl() 传递给 get() 或 navigate().to() 会重新加载相同的地址。
  • 键盘路线: sendKeys 接受 Keys.F5 或 Unicode 值 \uE035,但它必须指向一个真实的元素。
  • 🧪 脚本路由: Javascript当 WebDriver 命令被阻塞时,执行器运行 location.reload() 可以正常工作。
  • 🛠️ 重新加载后: 之前捕获的每个元素引用都会失效,需要重新定位。
  • 📊 现代配置: Selenium Manager 是在 4.6 版本中引入的,因此不再需要手动设置驱动程序路径。

使用刷新页面 Selenium WebDriver 命令

在对基于 Web 的应用程序进行自动化测试时,有时需要多次刷新页面才能完全加载所有 Web 元素。首次页面加载时,可能只加载了部分 Web 元素,而需要第二次页面刷新才能显示所有元素。这可以通过提供的刷新命令来实现。 Selenium WebDriver。

如何刷新页面 Selenium

浏览器刷新操作可以使用以下方式执行 Selenium。我们将在整篇文章中详细讨论下面提到的方法。

  1. driver.navigate().refresh() 命令
  2. 获取方法
  3. 发送按键命令
  4. Navigate 方法
  5. driver.navigate().to() 命令

1) driver.navigate().refresh() 命令

这是由提供的用于执行页面刷新操作的内置方法。 Selenium WebDriver。此命令是自动化测试中最常用的命令,用于执行页面刷新操作。刷新命令的使用方法如下所述。

driver.get("https://demo.guru99.com/selenium/guru99home/");
driver.navigate().refresh();

导航接口用于执行各种浏览器操作,例如导航到上一页、导航到下一页、页面刷新和关闭浏览器。可以使用 `driver.navigate()` 命令访问导航接口的方法。导航接口的刷新方法不接受任何参数,也不返回任何值。

计费示例:

测试场景:

  1. 打开Chrome浏览器并输入网页 https://demo.guru99.com/selenium/guru99home/
  2. 页面加载成功后,使用 driver.navigate().refresh() 方法刷新网页。
  3. 使用 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 输出:

初始页面加载时,演示主页的渲染效果如下所示。

Guru99 演示主页在刷新命令运行前的初始加载状态

页面刷新操作后,页面上的视频发生了变化,这证实了页面确实重新加载了。

Guru在 driver.navigate().refresh() 之后,99 演示主页显示了不同的视频

刷新页面的其他几种方法

刷新并非重新加载页面的唯一途径。以下四种方法也能达到同样的效果,值得了解,因为某些锁定的应用程序或顽固的浏览器有时会阻止其中一种方法生效。

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();");

有两种变体值得记住:

  1. location.reload() 执行正常页面重新加载,并可能从缓存中提供页面。
  2. history.go(0) 是某些旧版套件仍在使用的较旧版本。

执行器路由在页面内部运行,因此它不会自行等待新文档。请像在 `driver.navigate().refresh()` 之后一样,显式地等待新文档加载完毕。请记住,脚本驱动的页面重新加载不会清除浏览器级别的对话框。如果被测应用程序异步加载其内容,则需要注意以下事项: 处理 AJAX 调用 Selenium 网络驱动程序.

如何避免刷新后出现 StaleElementReferenceException 异常

页面刷新会销毁当前的 DOM 并构建一个新的 DOM。刷新前捕获的每个 WebElement 现在都指向一个已不存在的节点,因此对它们的下一次调用会抛出 StaleElementReferenceException 异常。这是页面刷新后最常见的错误。

三个习惯几乎可以消除所有这些失败:

  1. 定位在之后,而不是之前。 存储 By 定位器而不是 WebElement,并在重新加载完成后再次调用 findElement。
  2. 等待真正的信号。 对于仅在重新加载后才存在的元素,显式等待其可见性比固定的睡眠时间可靠得多。
  3. 刷新页面,然后重新阅读。 永远不要将重新加载之前捕获的文本值或属性带入重新加载之后进行的断言中。

以下模式适用于所有三种情况:

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 调用,并将脚本路由视为备用方案。

常见问题

有可能。如果当前页面是通过 POST 请求生成的,浏览器可能会请求重新发送数据,而页面重新加载会因为这个对话框而停滞。导航到 URL 再次使用 get() 函数可以完全避免提示。

绑定名称不同,但命令相同:driver.refresh() Python,在 C# 中调用 driver.Navigate().Refresh(),在 Java这三者都发出相同的 WebDriver 指令。

不。重新加载页面会保留同源页面的 cookie、会话存储和本地存储,因此刷新页面并不是重置状态的好方法。应该显式删除 cookie 或重新启动浏览器会话。

自愈引擎在重新加载 DOM 不再匹配时,会根据多个属性重新解析定位器;故障分析模型会将重新加载时间不稳定的情况集中起来,以便团队只需修复一个等待问题,而不是修复五十个测试。

是的,单行刷新调用确实有效,而且效果始终良好。问题出在后续的等待时间上,所以需要根据应用程序的实际加载情况来检查生成的超时时间。

没有专门的命令。团队通常通过 Actions 类同时发送 Ctrl 和 F5 来近似实现此功能,或者通过浏览器选项禁用缓存,后者是更可靠的方法。

刷新命令无法解决这个问题,因为它总是重新加载顶层文档。需要切换到框架并使用脚本重新加载,或者重置其源属性,然后再切换回默认内容。

不要使用固定的等待时间。在页面重新加载后,使用一个明确的等待时间(10 到 30 秒),并设置一个仅对重新加载后的条件成立,这样测试就能在页面准备就绪后立即继续进行。

总结一下这篇文章: