如何使用 ChromeDriver 在 Selenium 中不等待页面加载完成?(移动的)

GDo*_*cal 5 c# selenium android selenium-chromedriver

我正在使用 ChromeDriver 为 Android Chrome 浏览器编写测试。我使用 C#。我的目标是并行使用几个 chrome 标签。当一个页面因加载一些数据或进行一些计算而卡住时,我想切换到另一个选项卡并进行另一次测试,并不时进行一些检查:上一页是否已加载,如果是,则对其进行另一项工作。

问题:当您设置 driver.Url单击加载另一个页面的元素时,您的线程会卡住,直到加载整个页面。对我来说不行。但我找到了解决方法,我可以像这样超时执行脚本:

driver.ExecuteScript(string.Format("setTimeout(function() {{ location.href = \"{0}\" }}, 150);", url));
Run Code Online (Sandbox Code Playgroud)

现在至少我的 C# 线程没有卡住。

现在我需要有办法检查页面加载是否完成。理论解决方案:在执行上面的代码之前,我可以从文档中获取 HTML 元素并检查一些它的属性,在加载新页面后,我要求旧元素的任何属性(不再存在) - 我会得到 StaleElementReferenceException。所以我的计划听起来不错,但行不通。当页面正在加载并且我询问元素的属性时 - 我的踏板一直卡在页面加载之前。我使用 fiddler 代理来增加页面加载时间,以便有足够的时间来调查这个问题(我冻结了页面加载并降低了我通过 fiddler 的连接速度)。此外,我尝试不访问任何 DOM 元素,而只是执行“return true;”之类的脚本。- 同样的问题,直到页面加载为止。

有没有办法不等待页面加载?也许是否可以使用不同的 chromedriver 实例连接到不同的选项卡?我将不胜感激任何建议!

ChromeDriver 版本:2.27.440174 System1:Windows 10 x64 System2:Samsung S6 Android 6.0.1

更新 1:我发现https://github.com/bayandin/chromedriver/blob/e9a1f55b166ea62ef0f6e78da899d9abf117e88f/chrome/page_load_strategy.h 在那里我可以看到三种类型的行为:正常、无、急切;似乎默认情况下 ChromeDriver 使用 Normal。这意味着等到页面加载完毕。我需要使用 None - 这意味着不要等待任何东西(正是我需要的),但我无法让它工作。我都试过:

chromeOptions.AddAdditionalCapability("webdriver.load.strategy", "none");
chromeOptions.AddAdditionalCapability("pageLoadStrategy", "none");
Run Code Online (Sandbox Code Playgroud)

我收到了下一个错误:“未知错误:无法解析功能:chromeOptions\n来自未知错误:无法识别的 chrome 选项:pageLoadStrategy\n(驱动程序信息:chromedriver=2.27.440174(e97a722caafc2d3a8b807ee115bfb307f7d2c0=307ee115bfb307f7d2c00=307e115bfb307f7d2c0=30)。Windows16400000”

GDo*_*cal 1

这是我的解决方案:

private class ChromeOptionsEx: ChromeOptions
    {
        public override ICapabilities ToCapabilities()
        {
            var r =(DesiredCapabilities)base.ToCapabilities();
            r.SetCapability("pageLoadStrategy","none");

            return r;
        }
    }
Run Code Online (Sandbox Code Playgroud)

使用 ChromeOptionsEx 而不是 ChromeOptions。这些代码行:

chromeOptions.AddAdditionalCapability("webdriver.load.strategy", "none");
chromeOptions.AddAdditionalCapability("pageLoadStrategy", "none");
Run Code Online (Sandbox Code Playgroud)

不起作用,因为它将被添加到 ChromeOptions 中,但 pageLoadStategy 不是 chrome optionts,它是功能。Chrome 驱动程序希望在功能根中找到它。说明:ChromeOptions 生成下一个功能图:

  • {[浏览器名称,chrome]}
  • {[版本, ]}
  • {[平台,任何]}
  • {[chromeOptions,Dictionary2[System.String,System.Object]]}
  • {[pageLoadStrategy,none]} <-------- 我们应该在此处添加它,我的代码就是这样做的

其中 chromeOptions 是

  • {[args,ReadOnlyCollection1[System.String]]}
  • {[二进制,]}
  • {[androidPackage, com.android.chrome]}
  • {[pageLoadStrategy,none]}<-------------------- AddAdditionalCapability 添加值那里不行