我想用自定义超时时间
创建等待元素存在命令的等价物public static void WaitForElementPresent(string Xpath, int WaitTime, int OriginalWaitTime)
{
try
{
SeleniumBrowser.driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(WaitTime));
SeleniumBrowser.driver.FindElements(By.XPath(Xpath));
SeleniumBrowser.driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(OriginalWaitTime));
}
catch (Exception)
{
throw new Exception("Could not find the" + Xpath + "Xpath after" + DefaultWaitTime + "second");
}
}
到目前为止,我的代码看起来像这样,而不是在结束id处设置硬编码整数,而是从一些模糊函数中将之前的超时时间注册为整数中间测试并调用它以将超时重置为其先前时间
答案 0 :(得分:2)
你应该尽可能地避免那些隐含的超时并坚持明确的等待。显式等待不是Thread.Sleep(时间),而是显式等待你的元素。
在实现隐式和显式等待工作方面取得了巨大的成功。需要注意的一点是,C#会立即查找Element,当找不到它时,会因“No Such Element”异常而崩溃。如果混合使用隐式和显式等待,即使找到了元素,您也会等待,直到隐式等待时间完成。不好,给测试带来了巨大的时间问题。
除非需要,否则我不建议使用XPath,但是,您应该使用以下方法之一等待。这主要是使用Selenium代码处理的。
我个人扩展了Selenium,使用set Page Objects
进行以下调用预期条件方式:
public static void WaitForElement(this IWebElement element, IWebDriver
driver, int waitTime)
{
try{
var wait = new WebDriverWait(driver, timeSpan.FromSeconds(waitTime));
wait.Until(ExpectedConditions.ElementToBeClickable(element));
Logging.Information(elementText + " is clickable");
}
catch (NoSuchElementException)
{
throw new Exception("Could not find the" + Xpath + "Xpath after" + DefaultWaitTime + "second");
}
}
}
对于映射的页面对象,这看起来像这样:
SaveButton.WaitForElement(driver);
我还扩展了selenium以使用相同的等待未映射的页面对象。 您可以执行类似于扩展Driver类的操作,以匹配您当前正在执行的操作。
public static void WaitForLocator(this IWebDriver driver, By by, int waitTime)
{
Logging.Action("Using locator: " + by + " to find element");
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(waitTime));
wait.Until(ExpectedConditions.ElementToBeClickable(by)); //There are several Expected conditions
Logging.Information("Found element with locator: " + by);
}
对于您当前的示例
,这将是这样的driver.WaitForLocator(By.XPath('your XPath');
此方法还允许您通过更改按类型来使用CSS选择器,ID等。
明确等待元素的另一种方法是使用
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
var saveButton = wait.Until(x => driver.FindElements(By.XPath(Xpath));
不确定您是否打算使用driver.FindElements或driver.FindElement,因为该方法的名称是WaitForElementPresent但您使用的是driver.FindElements。查找元素返回的元素列表不仅仅是您要查找的元素。
希望这有帮助。