【问题标题】:Is there a need to add waits in between of the script in webdriver是否需要在 webdriver 中的脚本之间添加等待
【发布时间】:2016-06-21 08:37:33
【问题描述】:

我正在用 java 编写我的第一个 webdriver 脚本,该脚本运行良好,但速度非常快。

例如:- 我的 hmtl 页面中有文本框和下拉元素,我编写了用于发送键和从元素中选择值的脚本,但是当我执行脚本时,它非常快,是否需要在每次执行后进行隐式等待步 ?这值得吗 ?或者还有什么解决方案可以让脚本以流畅的方式运行,每一步都正确可见。

下面是我的代码:-

public static void main(String[] args) {

    WebDriver wb = new FirefoxDriver();
    wb.manage().window().maximize();
    wb.navigate().to("http://newtours.demoaut.com/");

    /*WebDriverWait wait1 = new WebDriverWait(wb, 50);
    WebElement element1 = wait1.until(ExpectedConditions.
    elementToBeClickable(By.xpath("//img[@alt='Mercury Tours']")));*/

    wb.findElement(By.xpath("//a[text()='REGISTER']")).click();

    wb.findElement(By.xpath("//input[@name='firstName']")).sendKeys("Rameshwari");
    wb.findElement(By.xpath("//input[@name='lastName']")).sendKeys("Nayak");
    wb.findElement(By.xpath("//input[@name='phone']")).sendKeys("7208471118");
    wb.findElement(By.xpath("//input[@id='userName']")).sendKeys("Rama");

    wb.findElement(By.xpath("//input[@name='address1']")).sendKeys("Nithyanand Chawl");
    wb.findElement(By.xpath("//input[@name='city']")).sendKeys("Mumbai");
    wb.findElement(By.xpath("//input[@name='state']")).sendKeys("Maharashtra");
    wb.findElement(By.xpath("//input[@name='postalCode']")).sendKeys("4000017");

     Select dd = new Select(wb.findElement(By.xpath("//select[@name = 'country']")));
     dd.selectByVisibleText("INDIA");   

}

【问题讨论】:

  • 您希望脚本尽可能快地运行。我会从不等待开始,看看它是如何工作的。您可能需要运行它 50 次或其他什么来查看是否有问题。仅在需要时且仅在需要时添加等待。对于您上面的代码,我猜您根本不需要任何等待。您可能需要等待的时间是您在页面上执行某些更改页面内容的操作。如果您尝试与更改的内容进行交互,您可能需要等待内容更改后才能与它进行交互。
  • 如果您想查看要调试的每个步骤,请放置断点并单步执行代码。您不应该希望脚本变慢,这样您就可以观察执行情况并了解发生了什么。
  • @JeffC 哦,谢谢

标签: selenium selenium-webdriver wait


【解决方案1】:

您可以根据需要选择以下任何一种,但不要同时使用隐式和显式等待。这将导致等待时间不一致,即使您在认为应该没有。

隐式等待 -

隐式等待是告诉 WebDriver 在尝试查找一个或多个元素(如果它们不是立即可用的)时轮询 DOM 一段时间。

默认设置为0。一旦我们定义了隐式等待,它将设置为WebDriver对象实例的生命周期。

它将被写入一次并自动应用于整个会话。一旦我们启动 Webdriver,它应该立即应用。

隐式等待不适用于应用程序中的所有命令/语句。它仅适用于“FindElement”和“FindElements”语句。

如果我们设置隐式等待,如果在第一个实例中没有找到元素,find element 不会抛出异常,而是会轮询该元素直到超时,然后继续进行。

显式等待 -

如果您想根据特定条件等待 - 例如 visibilityOfWebElement、ElementToBeClickable 等,您可以使用显式等待。

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("xyz")));

显式等待主要用于当我们需要在执行任何操作后等待特定内容/属性更改时,例如当应用程序向系统发出 AJAX 调用并获取动态数据并在 UI 上呈现时。

示例:像有下拉Country和State一样,根据选择的country值,state下拉列表中的值会发生变化,这需要几秒钟的时间才能获得基于用户选择的数据。

流畅等待 -

使用 FluentWait,我们可以定义等待条件的最长时间,以及检查条件的频率。

用户还可以配置为在搜索元素时忽略特定类型的异常,例如“NoSuchElementExceptions”。由 findElement(By) 和 findElements(By) 抛出 NoSuchElement 异常。当它试图找到任何元素时,它会返回当前页面上的第一个匹配元素,否则它会抛出 NoSuchElementException - 当没有找到匹配的元素时。

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                    //Wait for the condition
                       .withTimeout(30, TimeUnit.SECONDS) 
                         // which to check for the condition with interval of 5 seconds. 
                       .pollingEvery(5, TimeUnit.SECONDS) 
                     //Which will ignore the NoSuchElementException
                       .ignoring(NoSuchElementException.class);

【讨论】:

  • 感谢您的详细解释,我理解这一点,但我的问题是我可以在每一步之后添加等待吗?这是一个好的脚本吗?就像我的页面上有 5 个文本框一样,我可以在每一步之后添加 5 个等待,以便每一步都可见吗?
  • 是的,如果您的测试需要在元素可见之前进行此等待,则可以在每个步骤之前添加此等待。也就是说,显式等待。如果您打算使用隐式等待,则只需设置一次。
  • 如果您使用隐式等待,您只需在代码中添加一次。但是,如果您希望某些条件对您正在工作的元素为真(尝试查找或输入值、单击等),您应该进行显式等待或流畅等待。必须为单个元素添加显式/流畅的等待,具体取决于您希望该特定元素为真的条件。希望有帮助!!
【解决方案2】:

在代码中提供一次隐式等待属性就足够了,它适用于代码中的所有语句。 只有在由于页面加载而无法找到元素的情况下,您才需要等待。如果脚本按预期工作,则从性能角度来看越快越好。

【讨论】:

  • 是的,就是这样,我们在页面加载后隐式等待查找元素。该脚本无需等待即可正常工作,但执行速度非常快,我无法看到每一步。那么有什么方法或解决方案可以让我的脚本顺利运行,让每一步都可见。
  • 您可以在每条语句之后使用 Thread.sleep(0500); 来等待。这将保持执行那么多毫秒。像这样它将保持''0500''毫秒。这样你就可以很好地看到运行了。
  • 据我所知,您无法控制运行速度,但您可以使用变通方法。您可以创建一个返回类型为 WebElement 的方法,该方法将您的元素与执行操作所需的内容一起添加,并在其中添加 thread.sleep()。这样您就不必一直手动将其添加到您的代码中。例如:**WebElement navto(String str) { Thread.sleep(500); WebElement ele = driver.findElement(By.xpath(".//*[@"+str+"]"));回电; } ** //因此您可以根据需要进一步进行任何处理或修改方法
  • 你为什么删除然后重新发布?请不要只是以这种方式避免负面反馈;而是直接解决该反馈。如果您继续这样做,您最终将无法添加更多答案。
  • 现在你有两个几乎相同的帖子:-) 请删除一个;下次最好只评论并更新一个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 2012-03-27
相关资源
最近更新 更多