我必须编写一个小测试并且我被卡住了,因为首先我必须在页面上搜索某些内容,然后对其进行排序(下拉列表),然后单击动态列表中的项目。
但是,在点击dropdwon列表中的项目之前,click
已注册。手头的问题是我在排序页面和未排序页面之间找到的唯一区别是页面地址,并且所选择的排序类型已添加class="selected"
,仅此而已。
隐式等待不起作用,因为列表中的项目仍然具有相同的类,并且除了订单之外没有任何更改,并且它将它们视为正确加载。我没有什么可以想到的,我可以使用显式等待。我能想到的唯一解决方案是等待加载特定网址但我无法找到解决方案来执行此操作。
答案 0 :(得分:0)
由于你已经尝试过隐式等待,所以你可以使用一个很好的“黑客”。而不是等待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
}
}
要获得更完整的解决方案,您可能希望将超时和取消令牌作为可选参数传递给该代码。
这不是最漂亮的代码,但是在隐式和显式等待失败的情况下,它可以在生产中默默地使用多年。