使用 selenium webdriver 自动点击 chrome://extensions 页面上的按钮

Automate a button click on chrome://extensions page using selenium webdriver

我正在尝试编写一个自动化测试来自动执行 google chrome 扩展程序的更新过程。我不知道还有另一种自动执行此操作的方法,所以这是我目前正在尝试执行的操作:

  1. 打开 chrome 扩展页面(据我所知,这只是一个 html 页面,除非我遗漏了什么)。

  2. 单击 "Update extensions" 按钮

这是我打开 chrome 扩展页面时尝试过的内容:

IwebElement UpdateButton = driver.findelement(By.Id("update-extensions-now"));
UpdateButton.Click();

由于某种原因,按钮点击没有注册。我已经尝试了一些其他定位器,例如 CSS path 和 Xpath,但它们也不起作用。此外,当我调试此测试时,它顺利通过,所以我知道这不是我的任何定位器的问题。我已经(作为测试)尝试自动点击此页面上的其他元素,这是同样的问题。我根本无法处理 chrome://extensions 页面上的任何元素。

有没有人遇到过这种情况或对发生的事情有任何想法?

您可以使用 Chrome 扩展 API 来自动更新所需的扩展。 在默认GoogleChrome

中找到文件"manifest.json"
C:\Users\*UserName*\AppData\Local\Google\Chrome\User Data\Default\Extensions

找到您的扩展的更新 URL:

{
  "name": "My extension",
  ...
  "update_url": "http://myhost.com/mytestextension/updates.xml",
  ...
}

Google 服务器返回的 XML 看起来像:

<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='yourAppID'>
    <updatecheck codebase='http://myhost.com/mytestextension/mte_v2.crx' version='2.0' />
  </app>
</gupdate>

appid 扩展程序或应用程序 ID,根据 public 键的哈希值生成,如打包中所述。您可以转到扩展程序页面 (chrome://extensions) 找到扩展程序或 Chrome 应用程序的 ID。

代码库 A URL 到 .crx 文件。

版本 客户端使用它来确定是否应该下载代码库指定的 .crx 文件。它应该与 .crx 文件的 manifest.json 文件中 "version" 的值相匹配。

更新清单 XML 文件可能通过包含多个元素来包含有关多个扩展的信息。

另一种选择是使用 --extensions-update-frequency 命令行标志来设置更频繁的间隔(以秒为单位)。例如,要每 45 秒检查一次 运行,运行 Google Chrome 像这样:

chrome.exe --extensions-update-frequency=45

请注意,这会影响对所有已安装的扩展程序和应用程序的检查,因此请考虑这对带宽和服务器负载的影响。您可能想暂时卸载除您正在测试的那个以外的所有软件,并且在正常使用浏览器期间不应 运行 打开此选项。

更新每个单独扩展的请求将是:

http://test.com/extension_updates.php?x=id%3DyourAppID%26v%3D1.1

您可以在扩展开发者网站上找到更详细的信息:https://developer.chrome.com/extensions

如果您查看 "chrome://extensions" 页面的 HTML,您会注意到 "Update extensions now" 按钮包含在 iframe 中。在尝试注册按钮点击之前,您需要切换到 iframe。即:

(这是在 c# 中。请注意,此代码是根据内存编写的,因此可能不是 100% 准确。此外,您将希望编写更可靠的方法。此代码只是通过切换到 iframe 来快速演示, 它会正常工作)

String ChromeExtensionsPage = "chrome://extensions";
driver.Navigate().GoToUrl(ChromeExtensionsPage);
driver.Switchto().Frame("DesiredFrame");
IwebElement UpdateButton = driver.findelement(By.Id("DesiredButtonID"));
UpdateButton.Click();