我是Selenium的新手,之前正在使用Telerik免费测试框架。问题是我无法理解,如何使用已经[FindsBy]识别的元素等待,检查并点击。
前:
[FindsBySequence]
[FindsBy(How = How.Id, Using = "container-dimpanel")]
[FindsBy(How = How.CssSelector , Using = ".btn.btn-primary.pull-right")]
public IWebElement UpdateButton { get; set; }
internal void ClickUpdateButton(TimeSpan timeout)
{
new WebDriverWait(_driver, timeout).
Until(ExpectedConditions.ElementIsVisible(By.CssSelector(id));
UpdateButton.Click();
}
我希望我的代码等待更新按钮可见,然后单击它。但我想传递UpdateButton元素而不是使用By选择器。
答案 0 :(得分:2)
接受WebElement的可见性存在预期条件: https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html#visibilityOf-org.openqa.selenium.WebElement-
Until
也会返回正在等待的元素,因此您可以将其合并为一行:
internal void ClickUpdateButton(TimeSpan timeout)
{
WebDriverWait wait = new WebDriverWait(_driver, timeout);
wait.Until(ExpectedConditions.visibilityOf(UpdateButton)).click();
}
然而,在我的框架中,我通常会添加一个辅助函数来执行此操作,因为它已经被大量使用了。你也可以做类似的事情,等到可点击等等,并且有接受WebElement或By的方法:
public WebElement waitThenClick(WebElement element)
{
WebDriverWait wait = new WebDriverWait(_driver, timeout);
return wait.Until(ExpectedConditions.visibilityOf(UpdateButton)).click();
}
答案 1 :(得分:1)
C#客户端没有内置条件来检查代理WebElement
的可见性。
此外,预期条件ExpectedConditions.ElementIsVisible
会检查元素是否显示,但是从用户的角度来看,它不会检查元素是否可见。
所以最快最可靠的方法是重试服务员点击直到成功:
Click(UpdateButton, 5);
static void Click(IWebElement element, int timeout = 5) {
var wait = new DefaultWait<IWebElement>(element);
wait.IgnoreExceptionTypes(typeof(WebDriverException));
wait.PollingInterval = TimeSpan.FromMilliseconds(10);
wait.Timeout = TimeSpan.FromSeconds(timeout);
wait.Until<bool>(drv => {
element.Click();
return true;
});
}
答案 2 :(得分:0)
使用我编写的这个函数来测试一个元素,你可以直接传入这个名字。它将返回一个bool,你可以使用一个循环来等待元素出现。
static public bool verify(string elementName)
{
try
{
bool isElementDisplayed = driver.FindElement(By.XPath(elementName)).Displayed;
return true;
}
catch
{
return false;
}
return false;
}