【问题标题】:Locate only non-hidden elements using Selenium WebDriver in C#在 C# 中使用 Selenium WebDriver 仅定位非隐藏元素
【发布时间】:2012-04-17 04:45:51
【问题描述】:

我在网页上有一组记录,当单击记录时,会显示一个“删除”链接(实际上“未隐藏”,因为它实际上总是存在)。

当我试图访问这个“删除”链接时,我正在使用它的值。

当我使用Driver.FindElement 时,它会返回 first 删除链接,即使它是隐藏的,因此无法单击它(不应该因为它不是正确的链接)。

所以,我基本上想做的就是只找到 非隐藏 链接。下面的代码有效,但是当它遍历每个删除链接时,我担心它可能效率低下。

有没有更好的办法?

public class DataPageModel : BasePageModel
{
    private static readonly By DeleteSelector = By.CssSelector("input[value=\"Delete\"]");

    private IWebElement DeleteElement
    {
        get
        {
            var elements = Driver.FindElements(DeleteSelector);
            foreach (var element in elements.Where(e => e.Displayed))
            {
                return element;
            }
            Assert.Fail("Could not locate a visible Delete Element");
            return null;
        }
    }
}

【问题讨论】:

  • Selenium 测试很慢,所以这段代码可能不会增加 1% 的执行时间......我会更担心你的代码的可读性:意图的沟通。您是在寻找一个特定的链接还是任何非隐藏的删除链接。如果一个特定的,最好通过 ID 查找。如果有任何链接,我会为该属性找到更好的名称。
  • 即使只有 1%,当你多次调用它时,它也会产生滚雪球效应。接下来你知道你的构建需要几小时而不是几分钟。
  • 即使您在同一个测试中调用此方法 100 次,它也可能只花费您的服务器渲染一个页面所需时间的一小部分。为了缩短构建时间,测量和优化实际上需要很长时间的部分。这个方法不行。

标签: c# selenium webdriver selenium-webdriver pageobjects


【解决方案1】:

虽然我同意 @Torbjorn 的观点,即您应该厌倦将时间花在优化的地方,但我确实认为这段代码效率有点低。

基本上使代码变慢的原因是来回检查每个元素以查看其是否显示。为了加快代码速度,你需要一口气得到你想要的元素。

两个选项(都涉及javascript):

jQuery

看看将 jQuery 选择器引入 Selenium 的不同方法(我写过关于它的 here)。一旦你有了它,你就可以使用 jQuery 的 :visible 选择器。

或者,如果您确定页面已经加载了 jQuery,并且您不想执行所有额外代码,则可以简单地使用 ExecuteScript

IWebElement element = (IWebElement)driver.ExecuteScript("return $('input[value=\"Delete\"]:visible').first().get(0)");

Javascript

如果您想避免使用 jQuery,您可以编写一个 javascript 函数来执行您现在在 C# 中执行的相同操作:获取所有可能的元素并返回第一个可见的元素。

然后你会做类似的事情:

string script = //your javascript
IWebElement element = (IWebElement)driver.ExecuteScript(script);

根据您选择的选项,您可以在不同程度上权衡可读性,但它们都应该更有效。当然这些都需要在浏览器中启用javascript。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-15
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2020-01-29
    • 2016-12-10
    相关资源
    最近更新 更多