从 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();
}
}
这种方法是性能密集型的,但它可以完成任务。我希望。
好的,我想为我们的网络应用程序编写一个测试猴子。这只猴子应该 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();
}
}
这种方法是性能密集型的,但它可以完成任务。我希望。