Selenium WebDriver - 如果元素存在,请选择它,如果没有,请忽略它并继续下一个元素
本文关键字:元素 下一个 继续 请选择 WebDriver 如果 存在 Selenium 如果没有 | 更新日期: 2023-09-27 18:30:44
我刚刚完成一个测试脚本并访问一个相当动态的页面。有问题的页面出现一个元素(通常是单选按钮或复选框),该元素仅在满足先前页面中的某些条件时才存在。因此,我的测试将访问此页面与以前的标准无关,我想在处理这些元素"IF"时点击页面底部的"继续"元素。我有几个方法可以按ID单击元素,到目前为止有以下代码:
// Selects the "Confirm" button
IWebElement radioOption = mWebDriver.FindElement(By.Id("Radio_Button_Id"));
if (radioOption.Displayed)
{
this.ClickElementById("Radio_Button_Id");
// Clicks CONTINUE
this.ClickElementById("CONTINUE");
}
else
{
// Selects CONTINUE
this.ClickElementById("CONTINUE");
}
我正在尝试在此代码中处理如果出现单选按钮,请选择它,然后选择继续按钮。此外,如果未显示单选按钮,请忽略它并选择继续按钮。任何这方面的帮助将不胜感激。
尝试这样的事情:
//Displayed
public static bool IsElementDisplayed(this IWebDriver driver, By element)
{
IReadOnlyCollection<IWebElement> elements = driver.FindElements(element);
if (elements.Count > 0)
{
return elements.ElementAt(0).Displayed;
}
return false;
}
//Enabled
public static bool IsElementEnabled(this IWebDriver driver, By element)
{
IReadOnlyCollection<IWebElement> elements = driver.FindElements(element);
if (elements.Count > 0)
{
return elements.ElementAt(0).Enabled;
}
return false;
}
您不会收到任何异常,然后测试可以继续。
你说你得到了NoSuchElementExceptions。 radioOption.Displayed
测试以查看该元素在页面上是否可见,但如果该元素甚至不存在,它将引发错误。 (元素可以存在,但不可见)
要测试元素是否存在,您需要执行mWebDriver.FindElements
(注意 S)。 这将返回与您的选择器匹配的所有元素的List<WebElement>
,如果找不到任何元素,它将返回大小为 0 的列表(并且不会引发错误)。
这样,你的 if 语句将被if (radioOptions.size()!=0)
,并将检查元素是否存在(而不是它是否可见)。
我还使用它来测试元素是否存在并获取元素的句柄(如果存在):
namespace SeleniumExtensions
{
public static class WebDriverExtensions
{
public static bool TryFindElement(this IWebDriver driver, By by, out IWebElement element)
{
try
{
element = driver.FindElement(by);
return true;
}
catch (NoSuchElementException)
{
element = null;
return false;
}
}
public static bool IsElementEnabled(this IWebDriver driver, By by)
{
IWebElement element = null;
if (driver.TryFindElement(by, out element))
{
return element.Enabled;
}
return false;
}
}
}
这允许如下代码:
using SeleniumExtensions;
// ...
IWebElement element = null;
if (driver.TryFindElement(By.Id("item-01"), out element)
{
// use element
}
else
{
// element is null
}
或:
if (driver.IsElementEnabled(By.Id("item-01"))
{
// item is enabled
}