使Selenium不等待元素加载

4

我使用selenium有一段时间了,对于 IWebElement Wait 过程有一些疑问。

我们有显式等待和隐式等待,我使用它们并理解它们的含义,但是...

如何让selenium完全不等待元素?

我尝试不使用等待函数,但当我调用 FindElement 或者 GoToUrl 时,有时仍然不会立即返回,而是等待0到60秒。

我注意到大多数情况下,FindElement 中的等待没有返回元素,也没有任何原因需要等待。

例如:调用元素id可能需要3秒钟才能立即返回(很多次调用很多时间...),也许我做错了什么。

主要目的是完全控制程序并自己处理等待时间(以提高效率)。

也许有更好的文章来了解selenium查找元素的架构?(而不是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(); // *
  • 最后,在大约3~5秒钟之后才会抛出异常,而不是立即抛出异常(当我将隐式等待设置为60秒时,它可以找到该元素!)
1个回答

4
我不确定你所说的“如何使Selenium完全不等待元素?”是什么意思。
如果你的意思是完全不想让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。


我使用了:driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(0)); - Leon Barkan
1
driver.FindElement(By.PartialLinkText("someText")).Click(); 这行代码试图查找一个带有某些文本的元素,因此我认为可能需要一些处理和搜索时间,因为这是一种非常低效的查找元素的方式。您可以尝试使用更明确的定位器,如ID,并查看需要多长时间。 - Shamik
为了确保这一点,您可以使用任意不在页面中的随机ID触发查找元素。如果它在4-5秒内失败,则可以假定等待时间是由于搜索文本引起的。 - Shamik
我认为这是Selenium的默认行为。 - Shamik
我已经测试过了,即使有id,它也需要花费2到5秒才能响应(我理解webdriver RC需要在HTML源代码中查找该元素[我认为是DFS算法?])我能做些什么吗?... - Leon Barkan
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接