在Java中使用Selenium和Google Chrome无头浏览器测试时,动态JS内容未加载

zy1mlcev  于 2023-06-27  发布在  Go
关注(0)|答案(1)|浏览(286)
    • bounty还有4天到期**。回答此问题可获得+100声望奖励。zodac希望引起更多关注这个问题。

我正在尝试测试我作为Spring Boot项目的一部分制作的网站,我正在使用Selenium。我能够测试基本的东西,如加载页面和标题,但我正在努力与页面的实际内容。
我的页面有以下部分:

<div id="main">
    <div id="div_1"></div>
    <div id="div_2"></div>
    <div id="div_3"></div>
    <div id="div_4"></div>
</div>

内容从JS脚本加载:

document.addEventListener("DOMContentLoaded", function(event) {
    populateDivs()
})

我使用从类似问题中收集的以下选项初始化WebDriver(其他Selenium测试继续通过,所以我不认为这些选项是冲突的):

final ChromeOptions options = new ChromeOptions();
options.addArguments(
    "--headless",
    "--nogpu",
    "--disable-gpu",
    "--enable-javascript",
    "--no-sandbox",
    "--disable-extensions",
    "--disable-blink-features=AutomationControlled",
    "--disable-features=NetworkService,NetworkServiceInProcess",
     "start-maximized",
     "disable-infobars"
);

我还在我的测试用例中添加了一个等待,以便有时间加载内容:

final WebDriverWait wait = new WebDriverWait(driver, Duration.ofMinutes(1L));
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("div_1_content")));

我所做的任何尝试都不会改变这样一个事实,即即使在等待之后也不会加载任何内容。我不知道该怎么办-我是否使用了不正确的Selenium?或者我应该在JS端以不同的方式加载我的内容吗?

hzbexzde

hzbexzde1#

您需要注意以下几件事:

注:两种无头模式是什么?

    • --nogpu * 和 * --disable-gpu * 参数在现代Chrome浏览器中没有更多的关联。所以你可以放下它们。
  • 现代浏览器客户端没有JavaScript就无法正常工作,这是一个强制性的要求。所以你需要删除 * --enable-javascript *。
    • --no-sandbox * 不是必需的,除非您在作为系统的root/admin用户执行测试时遇到问题,并且可以删除。
    • --disable-extensions * 和 * disable-infobars * 参数不再有效。所以你可以放下它们。

Network Service

有一些网络服务。这些都是为了忘记Chrome的功能。

  • 这仅包含通过网络的特征。例如,无文件加载、数据URL等……
  • 只有最低级别的联网应该在这里。例如HTTP、套接字、网络套接字。在此基础上构建的任何东西都应该在更高的层中。
  • 应该在此代码之外构建更高级别的Web平台和浏览器功能。安全浏览、Service Worker、扩展、devtools等...这里不应该有钩子。唯一的例外是,如果没有网络服务中的一些钩子,这些功能就不可能运行。在这种情况下,我们添加所需的最小代码。一些示例包括devtools的流量整形、CORB阻塞和CORS。
  • 每个PostTask、线程跳和进程跳(IPC)都应该仔细计算,因为它们引入了可能损害性能关键代码的延迟。
  • NetworkContextNetworkService是受信任的接口,不会发送到渲染器。只有浏览器可以访问它们。

本用例

  • NetworkService * 和 * NetworkServiceInProcess * 是两个重要的配置,你不应该禁用它们。所以你需要删除参数:
"--disable-features=NetworkService,NetworkServiceInProcess"

结合上面的建议执行你的测试用例,你应该可以开始了。

tl; dr

一些有用的文档:

相关问题