制作硒无需等待元素
Make selenium No wait for element
我使用 selenium 有一段时间了,对 IWebElement Wait
过程有一些疑问。
我们有 Explicit Wait 和 Implicit 我使用它们并理解其含义但是..
如何让 selenium 完全不等待元素?
我试着不使用等待函数,但当我调用 FindElement
或 GoToUrl
时,它并不总是立即 return 有时仍然等待 0 到 60 秒
我注意到在大多数情况下 FindElement
中的等待没有 return 元素并且无缘无故地等待。
例如:调用元素 ID 可能需要 3 秒而不是立即(很多关闭调用很多时间...)
也许我做错了什么。
主要目的是完全控制程序并自己处理等待时间(以提高效率)
也许有更好的文章来了解 selenium 查找元素的架构? (不是硒API)
(我使用的是最新版本的 selenium 2.48.0)
代码示例:
driver = new FirefoxDriver();
js = driver as IJavaScriptExecutor;
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(0));
driver.Manage().Window.Maximize();
driver.Navigate().GoToUrl("someUrl");
IList<IWebElement> loginFrame = driver.FindElements(By.TagName("iframe"));
driver.SwitchTo().DefaultContent().SwitchTo().Frame(loginFrame[0]);
driver.FindElement(By.Id("userID")).SendKeys("username");
driver.FindElement(By.Id("userPassword")).SendKeys("userPassword");
driver.FindElement(By.Id("login")).Click();
driver.SwitchTo().DefaultContent();
driver.FindElement(By.XPath("//div[@class='something']/ul/li[2]/a")).Click();
driver.FindElement(By.PartialLinkText("someText")).Click(); // *
- At Last 在大约 3 ~ 5 秒后调用它的抛出异常,而不是立即调用(当我将隐式设置为 60 秒时,它找到了元素!)
我不确定你所说的 "how can I make selenium no wait for element at all? "
是什么意思
如果你的意思是你根本不想让 selenium 等待一个元素。我认为这可能有效 -
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
WebElement textbox = driver.findElement(By.id("textbox"));
使用它并编写您自己的方法,该方法需要一个定位器和等待秒数,然后根据传递给方法的内容在方法内设置隐式等待。
public WebElement locateElementById(int timeInSec, String id){
driver.manage().timeouts().implicitlyWait(timeInSec, TimeUnit.SECONDS);
WebElement element = driver.findElement(By.id(id));
return Element
}
像这样。然后你可以用你想要的秒调用它。
当你想要 0 秒传递 0 当你想要 10 秒传递 10.
我使用 selenium 有一段时间了,对 IWebElement Wait
过程有一些疑问。
我们有 Explicit Wait 和 Implicit 我使用它们并理解其含义但是..
如何让 selenium 完全不等待元素?
我试着不使用等待函数,但当我调用 FindElement
或 GoToUrl
时,它并不总是立即 return 有时仍然等待 0 到 60 秒
我注意到在大多数情况下 FindElement
中的等待没有 return 元素并且无缘无故地等待。
例如:调用元素 ID 可能需要 3 秒而不是立即(很多关闭调用很多时间...) 也许我做错了什么。
主要目的是完全控制程序并自己处理等待时间(以提高效率)
也许有更好的文章来了解 selenium 查找元素的架构? (不是硒API)
(我使用的是最新版本的 selenium 2.48.0)
代码示例:
driver = new FirefoxDriver();
js = driver as IJavaScriptExecutor;
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(0));
driver.Manage().Window.Maximize();
driver.Navigate().GoToUrl("someUrl");
IList<IWebElement> loginFrame = driver.FindElements(By.TagName("iframe"));
driver.SwitchTo().DefaultContent().SwitchTo().Frame(loginFrame[0]);
driver.FindElement(By.Id("userID")).SendKeys("username");
driver.FindElement(By.Id("userPassword")).SendKeys("userPassword");
driver.FindElement(By.Id("login")).Click();
driver.SwitchTo().DefaultContent();
driver.FindElement(By.XPath("//div[@class='something']/ul/li[2]/a")).Click();
driver.FindElement(By.PartialLinkText("someText")).Click(); // *
- At Last 在大约 3 ~ 5 秒后调用它的抛出异常,而不是立即调用(当我将隐式设置为 60 秒时,它找到了元素!)
我不确定你所说的 "how can I make selenium no wait for element at all? "
是什么意思如果你的意思是你根本不想让 selenium 等待一个元素。我认为这可能有效 -
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
WebElement textbox = driver.findElement(By.id("textbox"));
使用它并编写您自己的方法,该方法需要一个定位器和等待秒数,然后根据传递给方法的内容在方法内设置隐式等待。
public WebElement locateElementById(int timeInSec, String id){
driver.manage().timeouts().implicitlyWait(timeInSec, TimeUnit.SECONDS);
WebElement element = driver.findElement(By.id(id));
return Element
}
像这样。然后你可以用你想要的秒调用它。
当你想要 0 秒传递 0 当你想要 10 秒传递 10.