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

Selenium 是否需要在webdriver中的脚本之间添加等待,selenium,selenium-webdriver,wait,Selenium,Selenium Webdriver,Wait,我正在用java编写我的第一个webdriver脚本,该脚本运行良好,但速度非常快 例如:-我在hmtl页面中有文本框和下拉元素,我编写了用于发送键和从元素中选择值的脚本,但是当我执行脚本时速度非常快,是否需要在每个步骤后进行隐式等待?值得吗?或者还有什么解决方案可以使脚本以平滑的方式运行,从而使每个步骤都正确可见 下面是我的代码:- public static void main(String[] args) { WebDriver wb = new FirefoxDriver();

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

}

您可以根据需要选择以下任一选项,但不要同时使用隐式和显式等待。这将导致不一致的等待时间,并可能导致TimeOutException,即使您认为不应该存在任何异常

隐式等待-

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

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

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

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

如果我们设置了隐式等待,那么如果在第一个实例中找不到该元素,find元素将不会抛出异常,相反,它将轮询该元素直到超时,然后继续

显式等待-

若要基于某些条件进行等待,可以使用显式等待,如WebElement的可见性、ElementToBelickable等

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("xyz")));
显式等待主要用于在执行任何操作后需要等待特定内容/属性更改的情况,例如应用程序向系统发出AJAX调用并在UI上获取动态数据和渲染时

示例:与“国家/地区”和“州”下拉列表一样,基于选定的国家/地区值,“州”下拉列表中的值将发生更改,这将花费几秒钟的时间来获取基于用户选择的数据

流畅的等待-

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

用户还可以配置为在搜索元素时忽略特定类型的异常,例如“NoTouchElementExceptions”。findElement(by)和findElements(by)引发NoTouchElement异常。当它试图查找任何元素时,它将返回当前页面上的第一个匹配元素,否则它将抛出NoTouchElementException—当找不到匹配元素时

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);
Wait Wait=new FluentWait(驱动程序)
//等待病情好转
.带超时(30,时间单位。秒)
//每隔5秒检查一次。
.轮询间隔(5,时间单位。秒)
//这将忽略NoTouchElementException
.忽略(NoSuchElementException.class);

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

感谢您的详细解释,我理解这一点,但我的问题是,我可以在每个步骤后添加等待吗?这是一个好的脚本吗?就像我的页面上有5个文本框一样,我可以在每个步骤之后添加5个等待,以便每个步骤都可见吗?是的,如果您的测试需要在元素可见之前进行此等待,那么可以在每个步骤之前添加此等待。也就是说,明确的等待。如果要使用隐式等待,则只需设置一次。如果要使用隐式等待,则只需在代码中添加一次。但是,如果您希望您正在工作的元素的某些条件为真(尝试查找或输入值、单击等),则应选择显式等待或流畅等待。必须为单个元素添加显式/流畅的等待,这取决于您希望为该特定元素设置为true的条件。希望有帮助!!是的,就是这样,我们在页面加载后隐式等待找到一个元素。这个脚本在没有等待的情况下运行良好,但是执行速度非常快,我无法看到每个步骤。那么,是否有任何方法或解决方案可以使我的脚本顺利运行,从而使每个步骤都可见;在每次陈述之后,无论你想把它放在哪里,都要等待。这将使执行保持那么多毫秒。像这样,它将保持“0500”毫秒。根据我的知识,你不能控制跑步速度,但你可以使用一个变通方法。您可以创建一个返回类型为WebElement的方法,该方法将您的元素与执行操作所需的内容结合起来,并在其中添加thread.sleep()。这样,您就不必一直手动将其添加到代码中。例如:*WebElement navto(String str){Thread.sleep(500);WebElement ele=driver.findElement(By.xpath(“./*[@”+str+“]));return ele;}**//这样,您就可以进一步处理它,或者根据需要修改该方法为什么要删除然后重新发布?请不要这样避免负面反馈;而是直接处理反馈。如果你继续这样做,你将无法添加更多答案。现在你有两篇几乎相同的帖子:-)请删除一篇;下次最好只评论并更新一个答案。你希望你的脚本运行得尽可能快。我会毫不犹豫地开始,看看它是如何工作的。您可能需要运行它50次或其他时间,以查看是否