在C#中使用Selenium WebDriver仅查找非隐藏元素

时间:2012-04-17 04:45:51

标签: c# selenium webdriver selenium-webdriver pageobjects

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

尝试访问此“删除”链接时,我正在使用其值。

当我使用Driver.FindElement时,它会返回第一个删除链接,即使它已被隐藏,因此无法点击它(因为它不是正确的链接)。

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

有更好的方法吗?

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;
        }
    }
}

1 个答案:

答案 0 :(得分: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。