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

Find a locator from an element in Selenium

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

到目前为止,我已经能够登录,找到 webelements(过滤它们)然后随机找到 select 并单击它。我在随机点击后 运行 变成了 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,所以我不能使用它。我也找不到任何可以用作唯一 selector.

的属性

我难住了。

将_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();
       }

    }

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