【问题标题】:Parallel testing in Selenium with Telerik Kendo UI and screenshots subscribed to WebDriver events使用 Telerik Kendo UI 和订阅 WebDriver 事件的屏幕截图在 Selenium 中进行并行测试
【发布时间】:2022-08-16 08:12:47
【问题描述】:

该问题与 Kendo UI 的(下拉列表、组合框、搜索框等)onfocusoutblur 事件有关,它们在触发时关闭菜单下拉菜单,或者浏览器窗口失去焦点。在我的例子中,它是 WebDriver 的 GetScreenshot() 方法,它调用屏幕截图浏览器上的活动焦点。通过并行测试,我使用EventFiringWebDriver 事件截取屏幕截图。 Edge/Chrome浏览器有两个窗口并行运行,自GetScreenshot()被触发后,它们一直在闪烁。如果 Kendo UI 元素在其中一个窗口中打开,并且同时发生闪烁的那一刻,它会自动触发 onfocusoutblur 并关闭下拉菜单。因此,我的测试中有 40% 为假阴性。

你可以在这里看到元素的演示:https://demos.telerik.com/kendo-ui/dropdownlist/index

    标签: c# selenium kendo-ui webdriver screenshot


    【解决方案1】:

    我能够通过多步骤解决方案克服这个问题。这适用于 Edge/Chrome 103+ 和 Selenium 4.1+

    首先,我通过使用 WebDriver 的直接命令覆盖 GetScreenshot() 方法摆脱了主动焦点调用。

    public Screenshot GetScreenshot()
        {
            IHasCommandExecutor executor = Driver as IHasCommandExecutor;
            var sessionId = ((WebDriver)Driver).SessionId;
            var command = new HttpCommandInfo(HttpCommandInfo.PostCommand, $"/session/{sessionId}/chromium/send_command_and_get_result");
            executor.CommandExecutor.TryAddCommand("Send", command);
    
            var response = Send(executor, "Page.captureScreenshot", new JObject { { "format", "png" }, { "fromSurface", true } });
            var base64 = ((Dictionary<string, object>)response.Value)["data"];
            return new Screenshot(base64.ToString());
        }
    
        private Response Send(IHasCommandExecutor executor, string cmd, JObject args)
        {         
            var json = new JObject { { "cmd", cmd }, { "params", args } }; 
            var command = new Command("Send", json.ToString());
            return executor.CommandExecutor.Execute(command);
        }
    

    第二,我找到了 Chromium 浏览器的扩展,它禁用了 Visibility API。它们有很多,只需在 Chrome Web Store 中搜索“禁用可见性 API”即可。显然,它伪造了浏览器窗口的“活跃性”,因此onfocusoutblur 将不再触发。现在,您只需在实例化驱动程序时包含扩展名:

    var options = new EdgeOptions();
    options.AddExtension("your path to extension");
    new DriverManager().SetUpDriver(new EdgeConfig(), VersionResolveStrategy.MatchingBrowser);
    var service = EdgeDriverService.CreateDefaultService();
    Driver = new EdgeDriver(edgeOptions);
    

    【讨论】:

      猜你喜欢
      • 2013-12-06
      • 2019-10-03
      • 2021-05-23
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      相关资源
      最近更新 更多