当窗口在 Chrome 87 的后台时,Webdriver.io/Selenium 测试失败

Posted

技术标签:

【中文标题】当窗口在 Chrome 87 的后台时,Webdriver.io/Selenium 测试失败【英文标题】:Webdriver.io/Selenium tests fail when the window is in the background on Chrome 87 【发布时间】:2021-03-03 04:15:58 【问题描述】:

我刚刚升级到最新版本的 Chrome 87。我的 Webdriver.io/Selenium 测试过去运行良好,无论 Chrome 窗口是在前台还是后台。现在,升级后,如果窗口在前台,则测试通过,但如果在后台,则测试不通过。

我没有最小化运行我的测试的 Chrome 窗口。我只是按 Alt+Tab,这样我的 IDE 就在 Chrome 前面,它在后面。

我知道 Chrome 87 有一个新的“功能”,如果它不在前台,它会使用更少的 CPU。有没有办法通过 Chrome 或 Chromedriver 设置来关闭它?

我的测试似乎是找到要点击的按钮,但 Chrome 没有注册点击。

【问题讨论】:

【参考方案1】:

这是 Chrome 87 中的一个错误:

https://bugs.chromium.org/p/chromedriver/issues/detail?id=3641&sort=-id

解决方法

节点 JS

解决方法是在 Webdriver.io 的 desiredCapabilities 中设置“localState”,如下面的 Node.JS/Chimpy 中:

chimpOptions.webdriverio.desiredCapabilities = 
  chromeOptions: 
    args: ["--no-sandbox", ...],
    prefs: ...
    ,
    localState: 
      "browser.enabled_labs_experiments": ["calculate-native-win-occlusion@2"],
    ,
  ,
  ...
;

Java

ChromeOptions options = new ChromeOptions();
   
HashMap<String, Object> chromeLocalStatePrefs = new HashMap<String, Object>();
List<String> experimentalFlags = new ArrayList<String>();
experimentalFlags.add("calculate-native-win-occlusion@2");
chromeLocalStatePrefs.put("browser.enabled_labs_experiments", experimentalFlags);
options.setExperimentalOption("localState", chromeLocalStatePrefs);

上一个答案

另一种解决方法是在活动浏览器/IDE/等下方留下背景 Chrome 窗口的一小部分。

在下图中,您可以看到一小部分运行测试的 Chrome 窗口。

【讨论】:

【参考方案2】:

我正在使用 C# 并面临同样的问题。我通过添加如下所示的最小化和最大化窗口来添加解决方法。通常我们断言页面标题,因此切换到窗口带来焦点并且其他测试动作通过。以下是截图失败的解决方法。

private void MinMaxWindow(ChromeDriver driver)

        driver.Manage().Window.Minimize();
        driver.Manage().Window.Maximize();

编辑, 开发人员提供了如下解决方法。

Java

 ChromeOptions options = new ChromeOptions();   
    HashMap<String, Object> chromeLocalStatePrefs = new HashMap<String, Object>();
    List<String> experimentalFlags = new ArrayList<String>();
    experimentalFlags.add("calculate-native-win-occlusion@2");
    chromeLocalStatePrefs.put("browser.enabled_labs_experiments", experimentalFlags);
    options.setExperimentalOption("localState", chromeLocalStatePrefs);

Python

chrome_options = webdriver.ChromeOptions()
    experimentalFlags = ['calculate-native-win-occlusion@2']
    chromeLocalStatePrefs =  'browser.enabled_labs_experiments' : experimentalFlags
    chrome_options.add_experimental_option('localState',chromeLocalStatePrefs);

【讨论】:

我在bugs.chromium.org/p/chromedriver/issues/detail?id=3657#c12 ChromeOptions options = new ChromeOptions(); options.AddLocalStatePreference("browser", new enabled_labs_experiments = new string[] "calculate-native-win-occlusion@2" ); 这很好,但是您能添加 C# 等效项吗? ChromeOptions 选项 = new ChromeOptions(); options.AddLocalStatePreference("browser", new enabled_labs_experiments = new string[] "calculate-native-win-occlusion@2" );【参考方案3】:

目前,您可以使用此解决方法:

    下载以前版本的 Chrome。这个是81版的:https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Win/735601/

    通过链接查看其他版本:https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Win/

    通过参数“chrome_binary”指定 chrome.exe 可执行文件的直接路径:

java -jar selenium-server-standalone-3.141.59.jar -role node -hub http://192.168.88.42:4444/grid/register -browser browserName=chrome,platform=ANY,maxInstances=60,seleniumProtocol=WebDriver,applicationName=test4,chrome_binary=C:\Users\PC\Downloads\Win_735601_chrome-win\chrome-win\chrome.exe -maxSession 60
    享受使用旧版 Chrome 的乐趣。

【讨论】:

如何找到版本 86?【参考方案4】:

chromeOptions.addArguments("--disable-backgrounding-occluded-windows");

自从更新到 Chrome 87 和 chrome 驱动程序 87 后,我遇到了同样的问题。

在这里找到了修复: https://support.google.com/chrome/thread/83911899?hl=en

【讨论】:

【参考方案5】:

最新的 chrome - chromedriver 已解决此问题

【讨论】:

以上是关于当窗口在 Chrome 87 的后台时,Webdriver.io/Selenium 测试失败的主要内容,如果未能解决你的问题,请参考以下文章

chrome浏览器中选项设置中有一个“关闭Google Chrome 浏览器后继续运行后台应用程序”,这个最好怎么设置?

Chrome JS 控制台,如何在后台运行?

当应用程序关闭或在后台运行时弹出 UIAlertView 窗口

Mac Chrome 悬停事件在窗口最大化时表现不同

当应用程序在后台使用 Firebase 时,使推送通知显示为弹出窗口

在移动 Chrome 上隐藏键盘不会改变窗口高度