C# 在基于url单击之前,等待在Selenium WebDriver中加载页面
我必须写一个小测试,我被卡住了,因为首先我必须在页面上搜索一些东西,然后从下拉列表中排序,然后从动态列表中单击一个项目 但是,在单击dropdwon列表中的某个项目之前,将注册单击。目前的问题是,我能找到的排序页面和未排序页面之间的唯一区别是页面地址,所选的排序类型具有class=selected added,仅此而已C# 在基于url单击之前,等待在Selenium WebDriver中加载页面,c#,url,selenium,wait,C#,Url,Selenium,Wait,我必须写一个小测试,我被卡住了,因为首先我必须在页面上搜索一些东西,然后从下拉列表中排序,然后从动态列表中单击一个项目 但是,在单击dropdwon列表中的某个项目之前,将注册单击。目前的问题是,我能找到的排序页面和未排序页面之间的唯一区别是页面地址,所选的排序类型具有class=selected added,仅此而已 隐式等待不起作用,因为列表上的项仍然具有相同的类,除了顺序之外没有任何更改,并且它将它们视为已正确加载。我想不出有什么办法可以让我等待。我能想到的唯一解决方案是等待加载特定的ur
隐式等待不起作用,因为列表上的项仍然具有相同的类,除了顺序之外没有任何更改,并且它将它们视为已正确加载。我想不出有什么办法可以让我等待。我能想到的唯一解决方案是等待加载特定的url,但我找不到这样做的解决方案。因为您已经尝试了隐式等待,所以有一个不错的方法可以使用。不要在C端等待,而是注入一个JavaScript变量并轮询它
// once
var script = "window.__mySecretGlobal = 'false'; " +
"window.addEventListener('load', function(){ " +
"window.__mySecretGlobal = 'true'; " +
"});";
((IJavaScriptExecutor)driver).ExecuteScript(script);
现在,JavaScript将设置一个变量,您可以轮询该变量:
async Task WaitForLoad(){
var loaded = false;
var script = "return window.__mySecretGlobal"
while(!loaded){
var res = (string)((IJavaScriptExecutor)driver).ExecuteScript(script);
if(res.Equals("true")) return; // it's loaded!
await Task.Delay(100); // try again in 100 ms
}
}
对于更完整的解决方案,您可能希望将超时和取消令牌作为可选参数传递给该代码
这不是最漂亮的代码,但它在生产中默默地为我们工作了多年,隐式和显式等待都失败了 我应该把它粘贴到应该等待的地方,还是应该对您的代码做些其他的事情?它给我带来了很多错误,我不太确定如何修复它们。@owiec第二部分是一种方法。也许可以给出更多具体的例子。显示下拉列表的HTML。让我们看看你尝试了什么,以及它们是如何不起作用的。