好的想为我们的网络应用程序编写一个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,所以我无法使用它。我也没能找到任何可用作唯一选择器的属性。
我很难过。
答案 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();
}
}
这种方法性能密集,但它可以完成任务。我希望。