0

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

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

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

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

有没有更好的办法?

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

1 回答 1

1

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

基本上,使代码变慢的是来回检查每个元素以查看其是否显示。为了加快代码速度,您需要一次性获取您想要的元素。

两个选项(都涉及 javascript):

jQuery

看看将 jQuery 选择器引入 Selenium 的不同方法(我在这里写过)。一旦你有了它,你就可以使用 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。

于 2012-04-17T15:43:32.977 回答