首先,这里是C#代码(即使问题与语言无关):
public static void PollClick(IWebElement element, int timeout = defaultTimeout, int pollingInterval = defaultPollingInterval)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
while (stopwatch.Elapsed < TimeSpan.FromSeconds(timeout))
{
try
{
element.Click();
break;
}
catch (Exception)
{
System.Threading.Thread.Sleep(pollingInterval);
}
}
}
这个用于点击元素,但我可以轻松地用其他内容替换click命令(可见性检查,发送文本等)。我正在为IE,Edge,Firefox和Chrome设置自动化。我遇到过某些情况,某个网页驱动程序有错误或网页浏览器行为不当(元素仍然模糊,没有堆栈跟踪崩溃,以及其他奇怪的问题)。这个方法已被谨慎使用(一次或两次),因为我已经使用了现有的Selenium等待,甚至围绕这些等待创建了包装函数(包括一个等待直到不再抛出异常的函数)。让这个方法好用是不是一个坏主意?它确实通过了代码审查,但我只是好奇我还能为异常情况做些什么。
答案 0 :(得分:1)
执行这样的策略没有错。实际上,语言绑定本身与WebDriverWait
结构中的完全相同。在C#(以及其他语言绑定中,我相信),有一个通用版本并不特定于等待名为DefaultWait
的元素,这使得用户可以更好地控制捕获和忽略的异常,什么时间间隔使用,等等。在页面上重复操作(如点击元素)的警告是,操作有可能不止一次发生,这可能会产生意想不到的副作用。
答案 1 :(得分:0)
根据您的代码实现自定义轮询方法显然存在没有问题。
但问题是为什么?
Selenium语言绑定 Java,Python,C#,Ruby 在内部实现相同的功能,并为我们提供实现相同功能的API。因此,在现有图层中再添加一个图层肯定会对脚本执行的效果产生影响。
尽管如此,在创建新函数时,通常as per this discussion进行函数调用的通常成本是:
现在,在函数结束时撤消以上所有内容:
因此,就系统资源而言,创建和调用额外函数非常成本高昂。为避免这种情况,我们可以轻松利用 API 公开的服务,尤其是ExpectedConditions Class
,如下所示:
Presence
元素:期望检查网页上与定位符匹配的所有元素。
Visibility
元素:期望检查网页上与定位器匹配的所有元素是否可见。可见性意味着元素不仅会显示,而且高度和宽度也会大于0.
Click/Interactibility
:可以看到并启用检查元素的期望,以便您可以单击它。