是否需要在webdriver中的脚本之间添加等待

时间:2016-06-21 08:37:34

标签: selenium selenium-webdriver wait

我正在用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");   

}

2 个答案:

答案 0 :(得分:1)

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

隐含等待

隐式等待是告诉WebDriver在尝试查找一个或多个元素时,如果它们不能立即可用,则会在一定时间内轮询DOM。

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

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

隐式等待不会对应用程序中的所有命令/语句起作用。它只适用于" FindElement"和" FindElements"语句。

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

明确等待 -

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

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

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

示例:就像有下拉状态和状态,根据所选的国家/地区值,状态下拉列表中的值将会更改,这将需要几秒钟的时间来根据用户选择获取数据。 / p>

流利等待

使用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);

答案 1 :(得分:-2)

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