我在网页上有一组记录,当点击一条记录时,会显示一个“删除”链接(实际上是“非隐藏”,因为它实际上总是在那里)。
尝试访问此“删除”链接时,我正在使用其值。
当我使用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;
}
}
}
答案 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。