C# 如何在C中使用selenium web驱动程序检查元素不存在#
我盯着这个问题看,但找不到更好的答案,所以。。。把它贴在这里 我单击浏览器中的一个按钮,打开一个表单/div(动态生成)。在我按下按钮之前,表单/div元素不存在 现在,我试图检查form/div元素是否存在。我尝试了以下代码。但它在元素存在时工作,在元素不存在时抛出异常(第一个方法-超时,第二个方法,驱动程序停止) 方法1:C# 如何在C中使用selenium web驱动程序检查元素不存在#,c#,selenium-webdriver,C#,Selenium Webdriver,我盯着这个问题看,但找不到更好的答案,所以。。。把它贴在这里 我单击浏览器中的一个按钮,打开一个表单/div(动态生成)。在我按下按钮之前,表单/div元素不存在 现在,我试图检查form/div元素是否存在。我尝试了以下代码。但它在元素存在时工作,在元素不存在时抛出异常(第一个方法-超时,第二个方法,驱动程序停止) 方法1: ReadOnlyCollection<IWebElement> elements = Utility.Browser.FindElements(By.Tag
ReadOnlyCollection<IWebElement> elements = Utility.Browser.FindElements(By.TagName("div")); // Utility.Browser is the browser instance.
var expElement = from e in elements
where e.GetAttribute("id").Contains("element id")
select e;
return expElement.Count() > 0;
任何帮助都将不胜感激
谢谢。查看WebDriverWait。您可以定义一个等待函数,该函数将等待特定的时间来满足特定的条件。您基本上可以说“等待十秒钟,等待元素出现”。我在我的手机上,确切的语法可能不正确,但它看起来像下面这样
pulic bool ElementExist(IWebDriver driver)
{
var value = false;
var objWait = new WebDriverWait(driver, Timespan.FromMilliseconds(10000));
objWait.IgnoreExceptionTypes(typeof(WebDriverTimeoutException));
value = objWait.Until(b=>b.FindElements(By.TagName("div")).Count > 0);
return value;
}
您可以指定要忽略哪些类型的异常,例如ElementNotFound和StaleElement,如果发生这些异常,函数将继续等待。您还可以定义一个函数并将其作为参数传递给.Until函数。我在lamda表达式和内联函数定义方面缺乏技巧,否则我会给出一个更好的示例,但这肯定是最可定制的方法。查看WebDriverWait。您可以定义一个等待函数,该函数将等待特定的时间来满足特定的条件。您基本上可以说“等待十秒钟,等待元素出现”。我在我的手机上,确切的语法可能不正确,但它看起来像下面这样
pulic bool ElementExist(IWebDriver driver)
{
var value = false;
var objWait = new WebDriverWait(driver, Timespan.FromMilliseconds(10000));
objWait.IgnoreExceptionTypes(typeof(WebDriverTimeoutException));
value = objWait.Until(b=>b.FindElements(By.TagName("div")).Count > 0);
return value;
}
您可以指定要忽略哪些类型的异常,例如ElementNotFound和StaleElement,如果发生这些异常,函数将继续等待。您还可以定义一个函数并将其作为参数传递给.Until函数。我在lamda表达式和内联函数定义方面的技能不足,否则我会给出一个更好的示例,但这肯定是最可定制的方法。以下函数帮助我在C#Selenium代码中测试页面上是否存在元素:
公共静态bool IsElementPresent(此IWebDriver驱动程序,由)
{
返回驱动程序.FindElements(按).Count>0;
}
如果对你有帮助,请告诉我 以下函数帮助我在C#Selenium代码中测试页面上是否存在元素:
公共静态bool IsElementPresent(此IWebDriver驱动程序,由)
{
返回驱动程序.FindElements(按).Count>0;
}
如果对你有帮助,请告诉我 与这里已经给出的另外两个答案类似,我使用一种扩展方法来设计我的测试:
public static bool ElementExists(this IWebDriver driver, By condition, TimeSpan? timeSpan)
{
bool isElementPresent = false;
if (timeSpan == null)
{
// default to 15 seconds if timespan parameter is not passed in
timeSpan = TimeSpan.FromMilliseconds(15000);
}
var driverWait = new WebDriverWait(driver, (TimeSpan)timeSpan);
driverWait.IgnoreExceptionTypes(typeof(WebDriverTimeoutException));
isElementPresent = driverWait.Until(x => x.FindElements(condition).Any());
return isElementPresent;
}
然后,我在代码中使用以下内容:
var isElementPresent = _driver.ElementExists(By.ClassName("register"), TimeSpan.FromSeconds(90.00));
if (isElementPresent)
{
// do required processing...
}
希望这有帮助
[编辑]-当然,您可以重构扩展方法以返回所需的元素,如果您想在单个操作中完成所有操作,则默认为null
public static IWebElement FindElementAfterWait(this IWebDriver driver, By condition)
{
bool isElementPresent = false;
IWebElement singleElement = null;
var driverWait = new WebDriverWait(driver, TimeSpan.FromSeconds(90));
driverWait.IgnoreExceptionTypes(typeof(WebDriverTimeoutException));
isElementPresent = driverWait.Until(x => x.FindElement(condition) != null);
if (isElementPresent)
{
singleElement = driver.FindElement(condition);
}
return singleElement;
}
用法:
_driver.FindElementAfterWait(By.ClassName("register"));
_driver.FindElementAfterWait(ExpectedConditions.ElementIsVisible(By.Id("firstName")))
此外:
享受…与这里已经给出的其他两个答案类似,我使用一种扩展方法来设计我的测试:
public static bool ElementExists(this IWebDriver driver, By condition, TimeSpan? timeSpan)
{
bool isElementPresent = false;
if (timeSpan == null)
{
// default to 15 seconds if timespan parameter is not passed in
timeSpan = TimeSpan.FromMilliseconds(15000);
}
var driverWait = new WebDriverWait(driver, (TimeSpan)timeSpan);
driverWait.IgnoreExceptionTypes(typeof(WebDriverTimeoutException));
isElementPresent = driverWait.Until(x => x.FindElements(condition).Any());
return isElementPresent;
}
然后,我在代码中使用以下内容:
var isElementPresent = _driver.ElementExists(By.ClassName("register"), TimeSpan.FromSeconds(90.00));
if (isElementPresent)
{
// do required processing...
}
希望这有帮助
[编辑]-当然,您可以重构扩展方法以返回所需的元素,如果您想在单个操作中完成所有操作,则默认为null
public static IWebElement FindElementAfterWait(this IWebDriver driver, By condition)
{
bool isElementPresent = false;
IWebElement singleElement = null;
var driverWait = new WebDriverWait(driver, TimeSpan.FromSeconds(90));
driverWait.IgnoreExceptionTypes(typeof(WebDriverTimeoutException));
isElementPresent = driverWait.Until(x => x.FindElement(condition) != null);
if (isElementPresent)
{
singleElement = driver.FindElement(condition);
}
return singleElement;
}
用法:
_driver.FindElementAfterWait(By.ClassName("register"));
_driver.FindElementAfterWait(ExpectedConditions.ElementIsVisible(By.Id("firstName")))
此外:
享受…以下方法是我经常使用的方法,相信我真的做到了。 如果显示指定的元素,它将返回
true
,否则它将返回false
。
您可以像这样使用它:IsElementDisplayedByXpathVariableWait(“元素的Xpath\u”,5)代码>
5是检查元素是否在每次检查后暂停1秒的次数
public static bool IsElementDisplayedByXpathVariableWait(string xpath, int iterations)
{
bool returnVal = false;
int tracker = 0;
while (tracker < iterations)
{
try
{
tracker++;
IWebElement pageObject = _driver.FindElement(By.XPath(xpath));
if (pageObject.Displayed)
{
returnVal = true;
break;
}
}
catch (Exception e)
{
Wait(1000);
continue;
}
}
return returnVal;
}
公共静态bool IsElementDisplayedByXpathVariableWait(字符串xpath,int迭代)
{
bool returnVal=false;
int-tracker=0;
while(跟踪器<迭代次数)
{
尝试
{
跟踪器++;
IWebElement pageObject=_driver.FindElement(By.XPath(XPath));
如果(pageObject.Displayed)
{
returnVal=true;
打破
}
}
捕获(例外e)
{
等待(1000);
继续;
}
}
返回值;
}
下面的方法是我经常使用的方法,相信我,它真的做到了。
如果显示指定的元素,它将返回true
,否则它将返回false
。
您可以像这样使用它:IsElementDisplayedByXpathVariableWait(“元素的Xpath\u”,5)代码>
5是检查元素是否在每次检查后暂停1秒的次数
public static bool IsElementDisplayedByXpathVariableWait(string xpath, int iterations)
{
bool returnVal = false;
int tracker = 0;
while (tracker < iterations)
{
try
{
tracker++;
IWebElement pageObject = _driver.FindElement(By.XPath(xpath));
if (pageObject.Displayed)
{
returnVal = true;
break;
}
}
catch (Exception e)
{
Wait(1000);
continue;
}
}
return returnVal;
}
公共静态bool IsElementDisplayedByXpathVariableWait(字符串xpath,int迭代)
{
bool returnVal=false;
int-tracker=0;
while(跟踪器<迭代次数)
{
尝试
{
跟踪器++;
IWebElement pageObject=_driver.FindElement(By.XPath(XPath));
如果(pageObject.Displayed)
{
returnVal=true;
打破
}
}
捕获(例外e)
{
等待(1000);
继续;
}
}
返回值;
}
为什么不在FindElements()部分周围使用try-catch块,如果它引发异常,元素不存在,您可以返回是的,我在try-catch块中添加了这些语句,但是对于方法1,下一个findelemens