从Selenium中的元素中查找定位器

时间:2015-02-11 12:53:08

标签: c# selenium

好的想为我们的网络应用程序编写一个testmonkey。这只猴子应该log并随机开始输入值并点击webelements

到目前为止,我已经能够登录,找到webelements(过滤它们),然后随机选择一个并单击它。我通过随机点击次数后进入StaleElementReferenceException。所有的解决方案我能够找到建议我等待元素,或者我再次找到它。不幸的是,我没有元素的定位器或路径,我只有元素本身。

我的代码如下所示:

public void Start()
{
    List<IWebElement> elements = _seleniumAdapter.AllElementsOnPage();
    Debug.WriteLine("Elementcount: " + elements.Count);
    IWebElement element = elements[_random.Next(elements.Count)];

    Debug.WriteLine(element.TagName + "," + element.Text);

    element.Click();
    if (element.GetAttribute("type").Contains("text"))
    {
        Debug.WriteLine("text!");
        element.SendKeys(randomLetter());
    }
    Start();

}

有什么方法可以绕过StaleElementReference吗? AllElementsOnPage找到元素By.CssSelector("*"),然后在返回之前过滤列表,这样我只剩下可点击的元素。

我们的应用中的元素大部分时间都没有ID,所以我无法使用它。我也没能找到任何可用作唯一选择器的属性。

我很难过。

1 个答案:

答案 0 :(得分:0)

将_random.Next为您生成的索引存储在变量中。例如i。

然后在代码中进行更改以捕获StaleElementReferenceException。在Catch块中,您可以再次填充列表,并找到_random.Next为您生成的具有相同索引的元素。 尝试在catch块中再次单击它。如果仍然无法单击,则在第二个catch块中再次捕获它并记录此元素的属性并继续下一个元素。之后你可以检查这个元素究竟出了什么问题。请参阅下面更改的代码。

   public void Start()
    {
        List<IWebElement> elements = _seleniumAdapter.AllElementsOnPage();
        Debug.WriteLine("Elementcount: " + elements.Count);
        int i = _random.Next(elements.Count);
        IWebElement element = elements[i];

        Debug.WriteLine(element.TagName + "," + element.Text);
        try
        {
        element.Click();
        }
        catch(StaleElementReferenceException ex)
        {
           elements = _seleniumAdapter.AllElementsOnPage();
           element = elements[i];
           element.Click()

        }
        catch(Exception ex)
        {
            Debug.WriteLine(ex.Message);
            element = null;
        }
        if(element != null)
       {
        if (element.GetAttribute("type").Contains("text"))
        {
            Debug.WriteLine("text!");
            element.SendKeys(randomLetter());
        }
        Start();
       }

    }

这种方法性能密集,但它可以完成任务。我希望。