我正在使用ChromeDriver为Android Chrome浏览器编写测试。我用C#。 我的目标是并行使用少量镀铬标签。当一个页面因加载某些数据或进行一些卡尔卡而卡住时,我想切换到另一个选项卡并进行另一次测试,并不时进行一些检查:是否已经加载了上一页,如果是,则执行另一项操作。
问题: 设置driver.Url 或时,单击加载另一个页面的元素,直到整个页面加载为止。对我来说不行。 但是我找到了解决方法,我可以像这样用超时执行脚本:
driver.ExecuteScript(string.Format("setTimeout(function() {{ location.href = \"{0}\" }}, 150);", url));
现在至少我的C#线程没有卡住。
现在我需要检查页面加载是否完成。 理论解决方案 在执行上面的代码之前,我可以从文档中获取HTML元素并检查它的属性,并在新页面加载后我要求旧元素的任何属性(不再存在) - 我将得到StaleElementReferenceException。所以我的计划听起来不错,但它不起作用。 当页面是laoading并且我问元素的属性 - 我的踏板被卡住直到页面加载。我使用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");
我收到了下一个错误:"未知错误:无法解析功能:chromeOptions \ n from unknown error:无法识别的chrome选项:pageLoadStrategy \ n(驱动程序信息:chromedriver = 2.27.440174(e97a722caafc2d3a8b807ee115bfb307f7d2cfd9),platform = Windows NT 10.0 .14393 x86_64)"}
答案 0 :(得分:1)
这是我的解决方案:
private class ChromeOptionsEx: ChromeOptions
{
public override ICapabilities ToCapabilities()
{
var r =(DesiredCapabilities)base.ToCapabilities();
r.SetCapability("pageLoadStrategy","none");
return r;
}
}
使用ChromeOptionsEx而非ChromeOptions。 这些代码行:
chromeOptions.AddAdditionalCapability("webdriver.load.strategy", "none");
chromeOptions.AddAdditionalCapability("pageLoadStrategy", "none");
不起作用,因为它会被添加到ChromeOptions但pageLoadStategy不是chrome选项,它是功能。 Chrome驱动程序预计会在功能的根目录中找到它。 说明: ChromeOptions会生成下一个功能图:
其中chromeOptions是
答案 1 :(得分:0)
我使用解决方法来解决这个问题。首先,启动驱动程序,然后关闭窗口。然后启动RemoteWebDriver。请参阅下面的示例。
string binLocation = @"./";
ChromeOptions chromeOpt = new ChromeOptions();
chromeOpt.AddArguments("--disable-extensions");
ChromeDriverService service = ChromeDriverService.CreateDefaultService(binLocation);
service.Port = 9515;
var driver = new ChromeDriver(service, chromeOpt);
driver.Close();
var options = new Dictionary<string, object>();
options.Add("browserName", "chrome");
options.Add("pageLoadStrategy", "none");
var capabilities = new DesiredCapabilities(options);
var driver = new RemoteWebDriver(new Uri("http://localhost:9515"), capabilities);
答案 2 :(得分:0)
在 python 中,这似乎可以通过以下代码实现。抓取现在看起来更快,并且在某些网站上加载驱动程序 URL 卡住的情况更少,这种情况经常发生且随机发生。大多数动态网站都需要向下滚动才能让 JS 完成它的工作并加载页面的某些部分。因此,由于在我的代码中滚动和等待动态网站加载,因此将“pageLoadStrategy”设置为“none”似乎无论如何都不会影响页面加载的完成。
我已经根据其他语言和模块中的其他答案探索了这种可能性:
C:\Users\Haider\Anaconda3\envs\web-py37\Lib\site-packages\selenium\webdriver\common\desired_capabilities.py
这是对我有用的代码:
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("ignore-certificate-errors")
options.add_argument("--no-sandbox")
options.add_argument("disable-notifications")
options.add_argument("--disable-infobars")
options.add_argument("--disable-extensions")
# Avoid some websites stuck selenium and the whole process stuck in loading the page
capabilities = webdriver.DesiredCapabilities.CHROME.copy()
capabilities['pageLoadStrategy'] = "none" # default is "normal".
with webdriver.Chrome(options=options, desired_capabilities=capabilities) as driver:
driver.get(link)