我正在尝试使用selenium-webdriver在c#中自动化Internet Explorer以填充外部网站上的公式。 有时代码会随机抛出错误(无法找到名称== xxx的元素),因为它无法找到搜索到的元素。它不会每次都发生,也不一定在同一个地方。
我已经尝试使用以下代码设置implicitWait,这样可以减少错误次数。
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
从另一个下拉菜单中选择一个选项后,外部网页会从下拉列表中更改选择选项(通过重新加载)。
为了进一步拦截这些关键点,我等待2秒才能找到下拉选项ByName()
。
System.Threading.Thread.Sleep(2000);
网页只需不到半秒即可重新加载此下拉菜单,因此2秒就足够了。
你能告诉我我做错了什么,或者为什么webdriver看起来如此不稳定地找到元素。 我还注意到,只要程序正在运行,我就不允许在计算机上做任何其他事情,否则会更频繁地发生同样的错误。
我的Internet Explorer 8的驱动程序选项
var options = new InternetExplorerOptions()
{
InitialBrowserUrl = "ExternalPage",
IntroduceInstabilityByIgnoringProtectedModeSettings = true,
IgnoreZoomLevel = true,
EnableNativeEvents = false,
RequireWindowFocus = false
};
IWebDriver driver = new InternetExplorerDriver(options);
driver.Manage().Window.Maximize();
我的最终解决方案在20多项测试中完美运行而没有出现任何错误!
在课程中添加了以下内容
enum type
{
Name,
Id,
XPath
};
在我的驱动程序后面添加了这个
driver.Manage().Window.Maximize();
wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
Methode等待元素
private static void waitForElement(type typeVar, String name)
{
if( type.Id)wait.Until(ExpectedConditions.ElementToBeClickable(driver.FindElement(By.Id(name))));
else if(type.Name)wait.Until(ExpectedConditions.ElementToBeClickable(driver.FindElement(By.Name(name))));
else if(type.XPath)wait.Until(ExpectedConditions.ElementToBeClickable(driver.FindElement(By.XPath(name))));
}
在使用元素
调用任何事件之前调用该方法 waitForElement(type.Id, "ifOfElement");
答案 0 :(得分:1)
在Selenium中还有两个选项:
您可以通过Selenium中的 WebDriverWait 对象使用显式等待。通过这种方式,您可以等待元素出现在页面上。当它们出现时代码仍在继续。
一个例子:
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function<WebDriver, WebElement>()
{
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("foo"));
}
});
此外,您可以使用 FluentWait 选项。通过这种方式,您可以定义等待条件的最长时间,以及检查条件的频率。
var speed: CGFloat = 0.3 // speed in seconds
UIView.animate(withDuration: speed, animations: {
theTextView.contentOffset = .zero
}, completion: nil)
答案 1 :(得分:1)
您可以使用明确等待,如下例所示:
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("your locator")));