目标:使用PageObjects检查当前页面上是否存在元素/ IWebElement。
我知道您可以使用以下内容:
IWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(3));
IWebElement element = wait.Until(ExpectedConditions.ElementExists(By.Id("foo")));
但是当我使用PageObjects时,我不想再次使用id / xpath等。我目前正在使用下面的方法来检查元素是否存在。但要快速执行此操作,我首先设置隐式等待,然后将其重置为默认值。它工作得很好,但感觉很脏。
我发现了其他一些较老的帖子。但这还没有为我提供任何解决方案。希望你能帮忙!
PageObject:
[FindsBy(How = How.Id, Using = "errorMessage")]
public IWebElement btnSubmit { get; set; }
调用方法:
CheckElementExists(errorMessage))
方法;
public bool CheckElementExists(IWebElement pageObject)
{
Browser.getDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(100);
try
{
return pageObject.Equals(pageObject);
}
catch (NoSuchElementException)
{
return false;
}
finally
{
Browser.getDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);
}
}
答案 0 :(得分:0)
我没有C#的经验,但我认为它与JAVA非常相似,因此您可以在C#中转换以下JAVA代码。
如果想要编写函数来检查元素是否存在,这就是你可以做到的。
public boolean isElementExisit(WebElement element){
try{
element.getTagName();
return true;
}catch (NoSuchElementException){
return false;
}
}
如果你想写一些需要等待的东西,那么你可以使用流利的等待。
public void waitUntilElementIsPresent(WebElement element, int timeout){
Wait wait = new FluentWait<WebDriver>(driver)
.withTimeout(timeout, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
wait.until(new Function() {
@Override
public Boolean apply(Object o) {
element.getTagName();
return true;
}
});
}
答案 1 :(得分:0)
您应该可以根据您要使用的FindElement
在试用版中执行id
。如果它找到了,那么它将继续返回true
,但如果它抓住了NoSuchElementException
,那么它将返回false
:
bool CheckIfItExists(string ElementId)
{
try
{
driver.FindElement(By.Id(ElementId));
return true;
}
catch (NoSuchElementException)
{
return false;
}
}
答案 2 :(得分:0)
要断言元素的存在,请使用C#和NUnit
Assert.IsTrue(
btnSubmit.Displayed,
"Submit button should be displayed"
);
要断言元素的缺失,我真的很喜欢NUnit's Assert.throw语法。
Assert.Throws<NoSuchElementException>(
() => btnSubmit.Contains(""),
"Accessing Submit button should throw NoSuchElementException"
);