为Selenium自动化制作自定义轮询方法是否存在问题?

时间:2018-03-06 19:58:23

标签: c# selenium selenium-webdriver automation

首先,这里是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等待,甚至围绕这些等待创建了包装函数(包括一个等待直到不再抛出异常的函数)。让这个方法好用是不是一个坏主意?它确实通过了代码审查,但我只是好奇我还能为异常情况做些什么。

2 个答案:

答案 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:可以看到并启用检查元素的期望,以便您可以单击它。

相关问题