【问题标题】:Wait for element for certain amount of time等待元素一段时间
【发布时间】:2018-04-19 08:11:16
【问题描述】:

我在测试自动化实施过程中遇到了一个问题。特别是测试检查是否显示汉堡菜单。 到目前为止,我定义了元素和子元素,我只需要等待一秒钟,不要浪费时间如果我知道几秒钟后不会显示该元素。

WebDriverWait wait = new WebDriverWait(getDriver(), 1);
WebElement hamMenu = el.findElement(By.xpath(HAMBURGER_MENU_GENERAL_XPATH));

如何实现 findElement 方法,它会在一秒内尝试找到元素?我不想待太久...谢谢

【问题讨论】:

  • 这种方法也不好用。 wait.until(ExpectedConditions.visibilityOf(el.findElement(By.xpath(HAMBURGER_MENU_GENERAL_XPATH))));

标签: selenium webdriverwait


【解决方案1】:

试试这个 -

 WebElement elem = new WebDriverWait(driver, 1).until(ExpectedConditions.visibilityOfElementLocated(By.xpath(HAMBURGER_MENU_GENERAL_XPATH)));

【讨论】:

  • 问题是,有element.subelement。我需要在父元素中找到嵌套的子元素。
  • 您能否在问题中添加更多关于这方面的细节?悬停在主元素上后子元素会出现吗?
  • 是的,我有通过 for 循环迭代的 WebElements 列表(一种静态表)。每个元素都有需要检查的子元素(使用相对 xpath,例如我们的“.//div..”)。该子元素是否显示。我只想检查子元素是否在页面上,避免等待很长时间,因为 Webelements 列表很大。每次检查子元素需要几秒钟。我想让它更短。
  • HTML 结构的主元素中是否有单独的子元素?添加相关的 html 或检查源。如果在主元素 html 中,那么在使用主元素搜索子元素之前,您需要使用 1 秒的隐式等待。如果不在内部,则创建更长的 xpath 并使用显式等待。
【解决方案2】:

如果我总结您的要求如下:

  1. 检查汉堡菜单是否仅显示 1 秒:您需要 WebDriverWait 和适当的 ExpectedConditions
  2. 元素可能在几秒钟后显示/不显示:您需要将代码包装在 try-catch {} 块中,以便能够在没有汉堡包的情况下继续进行。

你的有效代码可以是:

try {
    WebElement hamburger =  new WebDriverWait(getDriver(), 1).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("HAMBURGER_MENU_GENERAL_XPATH")));
    System.out.println("Hamburger is displayed in 1 sec");
    //rest of your code
} catch (NoSuchElementException e){
    System.out.println("Hamburger wasn't displayed in 1 sec");
    //rest of your code
}

【讨论】:

  • 这就是问题所在。有以“.//...”格式使用的 xpath,这将找到不适用于特定元素的火腿菜单。我需要专注于要检查子元素的元素。所以在这种情况下,它需要是 el.findElement 而不仅仅是 findElement,其中 el 是 WebElement。所以最后 Webelement.findElement().... el.findElement(By.xpath(HAMBURGER_MENU_GENERAL_XPATH))
  • @Michal 你的这个问题与火腿菜单特定元素无关。 ham menuparticular element 的问题可能包含在您尚未提供任何信息的 HAMBURGER_MENU_GENERAL_XPATH 中。根据当前的问题标题和描述,我试图总结您的要求并为您提供答案。如果您的要求发生了变化,请随时针对您的新要求提出新问题。 SO 志愿者很乐意为您提供帮助。
  • 帖子标题可以重命名。请注意在原始帖子中有元素和子元素注释。
  • @Michal 您问题的底线是How to implement the method findElement in the way it will try to find the element in one sec?。在收到有效答案后更改问题将违反 stackoverflow 遵循的所有最佳实践。
【解决方案3】:

我明白了。感谢所有提示。这只会等待很短的时间。

public boolean isHamMenuDisplayed(){
getDriver().manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
if (el.findElements(By.xpath(HAMBURGER_MENU_GENERAL_XPATH)).size() == 0)
   return false;
else
return true;}

【讨论】:

  • 确保将隐式等待时间设置为 0 或之后的初始值。还要注意 HAMBURGER_MENU_GENERAL_XPATH 以'.'开头
  • @Michal 根据您对我的回答的评论,您在哪里I need to be focused on the element that has subelement to be checked?我错过了什么吗?
  • @Michal :真是令人失望,您复制了我的 findElements 并添加到您的答案中......
  • @PritamM.Maske 将此答案标记为抄袭您的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 2014-12-29
  • 2019-12-02
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多