提问者:小点点

我的代码线程。睡眠是有效的,但不是隐含的等待?


因此,我理解流畅而明确的等待,但过去我永远无法让隐含的语句起作用。我设法不使用显式词来处理它们,但我随后设计了一个相当简单的测试,但它只适用于线程。睡觉,我绝对讨厌这种方法,并试图不惜一切代价避免它。所以我再次尝试隐式等待函数。。。失败

下面的代码带有线程。睡眠按计划进行,非常好

package myPackages;

import java.util.concurrent.TimeUnit;

//  Unit test testing the Main User Drop Down Menu
//  This tests the following:
//      - changing status to Online, Away, Busy, Invisible via Left menu 
//      - Going to Settings
//      - Logging out

import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.safari.SafariDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class statusTest {

  private static WebDriver driver = new SafariDriver();

  public static String HOME_URL = "http://localhost:3000";
  public static String currentUserStatus;

  private static By usernameOrEmailFieldLocator = By.id("emailOrUsername");
  private static By passwordFieldLocator = By.id("pass");
  private static By loginButtonLocator = By.cssSelector("button.button.primary.login");

  private static By openMenuLocator = By.cssSelector("span.arrow.bottom");

  private static By onlineButtonLocator = By.cssSelector("button.status.online");
  private static By awayButtonLocator = By.cssSelector("button.status.away");
  private static By busyButtonLocator = By.cssSelector("button.status.busy");
  private static By invisibleButtonLocator = By.cssSelector("button.status.offline");
  private static By userStatus = By.className("thumb");


  @BeforeClass
  public static void beforeClass() {
    driver.get(HOME_URL);
    driver.findElement(usernameOrEmailFieldLocator).sendKeys("adrian");
    driver.findElement(passwordFieldLocator).sendKeys("adrian");
    driver.findElement(loginButtonLocator).click();
  }

  @Before
  public void before() throws Exception {
    Thread.sleep(100);
    new WebDriverWait(driver, 3).until(ExpectedConditions.presenceOfElementLocated(openMenuLocator)).click();
    Thread.sleep(100);
    new WebDriverWait(driver, 3).until(ExpectedConditions.presenceOfElementLocated(onlineButtonLocator)).click();
  }

  @AfterClass
  public static void doEnd() {
    driver.quit();
  }

  private static void changeStatusTo(By statusLocator) throws Exception {
    Thread.sleep(100);
    new WebDriverWait(driver, 3).until(ExpectedConditions.presenceOfElementLocated(statusLocator)).click();
    Thread.sleep(100);
    currentUserStatus = driver.findElement(userStatus).getAttribute("data-status");
  }

  @Test
  public void setAway() throws Exception {
    changeStatusTo(awayButtonLocator);
    Assert.assertEquals("away", currentUserStatus);
  }

  @Test
  public void setOnline() throws Exception {
    changeStatusTo(onlineButtonLocator);
    Assert.assertEquals("online", currentUserStatus);
  }

  @Test
  public void setBusy() throws Exception {
    changeStatusTo(busyButtonLocator);
    Assert.assertEquals("busy", currentUserStatus);
  }

  @Test
  public void setInvisible() throws Exception {
    changeStatusTo(invisibleButtonLocator);
    Assert.assertEquals("invisible", currentUserStatus);
  }

}

但当我最终尝试使用隐式(如下面)时,它就不起作用了。我确保在声明驱动程序之后立即声明一次(在本例中为@beforeclass)。考试会在课前的时间内失败。我在本页的最底部包括了跟踪堆栈:

package myPackages;

import java.util.concurrent.TimeUnit;

import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.safari.SafariDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class statusTest {

    private static WebDriver driver = new SafariDriver();

    public static String HOME_URL = "http://localhost:3000";
    public static String currentUserStatus;

    private static By usernameOrEmailFieldLocator = By.id("emailOrUsername");
    private static By passwordFieldLocator = By.id("pass");
    private static By loginButtonLocator = By.cssSelector("button.button.primary.login");

    private static By openMenuLocator = By.cssSelector("span.arrow.bottom");

    private static By onlineButtonLocator = By.cssSelector("button.status.online");
    private static By awayButtonLocator = By.cssSelector("button.status.away");
    private static By busyButtonLocator = By.cssSelector("button.status.busy");
    private static By invisibleButtonLocator = By.cssSelector("button.status.offline");
    private static By userStatus = By.className("thumb");


    @BeforeClass
    public static void beforeClass(){
        driver.manage().timeouts().implicitlyWait(100, TimeUnit.MILLISECONDS);
        driver.get(HOME_URL);
        driver.findElement(usernameOrEmailFieldLocator).sendKeys("adrian");
        driver.findElement(passwordFieldLocator).sendKeys("adrian");
        driver.findElement(loginButtonLocator).click();
    }

    @Before
    public void before() throws Exception {
        driver.findElement(openMenuLocator).click();
        driver.findElement(onlineButtonLocator).click();
    }

    @AfterClass
    public static void doEnd() {
        driver.quit();
    }

    private static void changeStatusTo(By statusLocator) {
        driver.findElement(statusLocator).click();
        currentUserStatus = driver.findElement(userStatus).getAttribute("data-status");

    }

    @Test
    public void setAway() {
        changeStatusTo(awayButtonLocator);
        Assert.assertEquals("away", currentUserStatus);
    }

    @Test
    public void setOnline() {
        changeStatusTo(onlineButtonLocator);
        Assert.assertEquals("online", currentUserStatus);
    }

    @Test
    public void setBusy() {
        changeStatusTo(busyButtonLocator);
        Assert.assertEquals("busy", currentUserStatus);
    }

    @Test
    public void setInvisible() {
        changeStatusTo(invisibleButtonLocator);
        Assert.assertEquals("invisible", currentUserStatus);
    }

}

组织。openqa。硒。NoSuchElementException:无法使用给定的搜索参数在页面上找到元素。(警告:服务器未提供任何stacktrace信息)命令持续时间或超时:999毫秒有关此错误的文档,请访问:http://seleniumhq.org/exceptions/no_such_element.html构建信息:版本:'unknown',版本:'1969d75',时间:'2016-10-18 09:43:45-0700'系统信息:主机:'Adrians iMac。本地,ip:'10.0.2.15',操作系统。名称:'MacOSX',操作系统。拱门:“x86_64”,操作系统。版本:“10.12.1”,java。版本:“1.8.0_111”驱动程序信息:org。openqa。硒。游猎。SafariDriver功能[{applicationCacheEnabled=true,rotatable=false,databaseEnabled=true,handlesAlerts=true,version=12602.2.14.0.5,cleanSession=true,platform=MAC,nativeEvents=true,locationContextEnabled=false,webStorageEnabled=true,browserName=safari,javascriptEnabled=true,CSSSelectorEnabled=true}]会话ID:DADE0351-039B-4C06-BC65-05FB90E08202***元素信息:{Using=css选择器,value=span.arrow.bottom}位于sun。反映国家结构附件MPL。sun上的newInstance0(本机方法)。反映国家结构附件MPL。sun上的newInstance(NativeConstructorAccessorImpl.java:62)。反映删除构造函数或AccessorImpl。java上的newInstance(DelegatingConstructorAccessorImpl.java:45)。朗。反思。构造器。org上的newInstance(Constructor.java:423)。openqa。硒。遥远的错误处理程序。在org上创建throwable(ErrorHandler.java:216)。openqa。硒。遥远的错误处理程序。throwIfResponseFailed(ErrorHandler.java:168)位于org。openqa。硒。遥远的RemoteWebDriver。在org上执行(RemoteWebDriver.java:635)。openqa。硒。遥远的RemoteWebDriver。findElement(RemoteWebDriver.java:368)位于org。openqa。硒。遥远的RemoteWebDriver。findelementbycsselector(RemoteWebDriver.java:465)位于org。openqa。硒。通过$ByCsSelector。findElement(By.java:430)位于org。openqa。硒。遥远的RemoteWebDriver。myPackages上的findElement(RemoteWebDriver.java:360)。状态测试。在sun(statusTest.java:53)之前。反映NativeMethodAccessorImpl。在sun上调用0(本机方法)。反映NativeMethodAccessorImpl。在sun上调用(NativeMethodAccessorImpl.java:62)。反映DelegatingMethodAccessorImpl。在java上调用(DelegatingMethodAccessorImpl.java:43)。朗。反思。方法在org调用(Method.java:498)。朱尼特。跑步者。模型框架方法$1。在org上运行reflectivecall(FrameworkMethod.java:50)。朱尼特。内部的跑步者。模型可反射的。在org上运行(ReflectiveCallable.java:12)。朱尼特。跑步者。模型框架方法。在org上以爆炸方式调用(FrameworkMethod.java:47)。朱尼特。内部的跑步者。声明。RunBefores。在org上评估(RunBefores.java:24)。朱尼特。跑步者。家长跑步者。org上的runLeaf(ParentRunner.java:325)。朱尼特。跑步者。BlockJUnit4ClassRunner。org上的runChild(BlockJUnit4ClassRunner.java:78)。朱尼特。跑步者。BlockJUnit4ClassRunner。org上的runChild(BlockJUnit4ClassRunner.java:57)。朱尼特。跑步者。家长跑步者3美元。在org上运行(ParentRunner.java:290)。朱尼特。跑步者。家长跑步者1美元。计划(ParentRunner.java:71)位于org。朱尼特。跑步者。家长跑步者。org上的runChildren(ParentRunner.java:288)。朱尼特。跑步者。家长跑步者。访问org上的$000(ParentRunner.java:58)。朱尼特。跑步者。家长跑步者2美元。在org上评估(ParentRunner.java:268)。朱尼特。内部的跑步者。声明。RunBefores。在org上评估(RunBefores.java:26)。朱尼特。内部的跑步者。声明。Runafter。在org上评估(runafter.java:27)。朱尼特。跑步者。家长跑步者。在org上运行(ParentRunner.java:363)。日食jdt。内部的junit4。跑步者JUnit4TestReference。在org上运行(JUnit4TestReference.java:86)。日食jdt。内部的朱尼特。跑步者测试执行。在org上运行(TestExecution.java:38)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。在org上运行测试(RemoteTestRunner.java:459)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。在org上运行测试(RemoteTestRunner.java:678)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。在org上运行(RemoteTestRunner.java:382)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。main(RemoteTestRunner.java:192)


共1个答案

匿名用户

使用TimeUnit。隐式中的秒等待而不是毫秒。快速浏览代码表明您在隐式等待中使用了100毫秒,与显式等待中分配的3秒相比,这是非常名义的。

 driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//waits for 3 seconds

注意:显式等待的单位为秒。

 new WebDriverWait(driver, 10) //will wait for 10 seconds 

1000ms=1s

如果时间单位必须以毫秒为单位,则应在隐式等待中使用3000ms。

相关问题