2012-04-17 125 views
0

我有一个网页上的记录集合,并且当单击一条记录时,会显示一个'Delete'链接(实际上是'unhidden',因为它实际上总是存在) 。只使用C#中的Selenium WebDriver查找非隐藏元素

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

当我使用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; 
     } 
    } 
} 
+0

硒测试很慢,所以这段代码可能不会将执行时间增加1%......我会更担心代码的可读性:意图交流。你正在寻找一个特定的链接或任何非隐藏的删除链接。如果一个具体的,它会更好地找到Id。如果有任何链接,我会为该物业找到更好的名称。 – 2012-04-17 05:51:45

+0

即使它只有1%,当你多次调用它时,它也会产生雪球效应。接下来的事情你知道你有一个需要几小时而不是几分钟的构建。 – 2012-04-17 06:00:38

+0

即使您在同一测试中调用此方法100次,它可能只需要您的服务器渲染一页所需的时间的一小部分。为了缩短构建时间,测量和优化实际需要很长时间的部件。这种方法不会。 – 2012-04-17 06:27:41

回答

1

虽然我@Torbjorn同意,你应该感到厌倦约你花你的时间优化,我认为这个代码是有点低效率的。

基本上,减慢代码的速度是每个元素的来回检查,看它是否显示。为了加速代码,你需要一口气获得你想要的元素。

两个选项(都涉及到的JavaScript):

jQuery的

看看不同的方法,把jQuery选择到硒(我写它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。

相关问题