因此,我理解流畅而明确的等待,但过去我永远无法让隐含的语句起作用。我设法不使用显式词来处理它们,但我随后设计了一个相当简单的测试,但它只适用于线程。睡觉,我绝对讨厌这种方法,并试图不惜一切代价避免它。所以我再次尝试隐式等待函数。。。失败
下面的代码带有线程。睡眠按计划进行,非常好
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)
使用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。
上面的代码工作得很好,但如果我使用wait而不是thread。sleep I get StaleElementReferenceException异常。这是我使用的流畅等待: 这将找到combobox,但再次对combobox执行任何操作将导致NoTouchElement或statestate异常。所以我也尝试了从combobox中选择值: 这超时和doesnot工作! 我如何才能使这项工作,为什
我是测试自动化的新手,尤其是Selenium。我正在使用Selenium网络驱动程序Eclipse。我遇到的最大问题之一是我们的脚本由于互联网速度或服务器性能而崩溃。我目前使用来解决这个问题。然而,这并不是秘密,强制等待时间直到计时器完成。我试图为下面的脚本找到一个优化的解决方案。在浏览了Stackoverflow上的帖子后,我找到了下面的)循环中提供的解决方案。有人建议使用: 以确保操作(单击按
我使用 C 和 POSIX 线程创建了一个多线程应用程序。我现在应该阻塞一个线程(主线程),直到设置了布尔标志(变为真)。 我找到了两种方法来完成这件事。 > 在没有睡眠的情况下旋转。 在睡眠中旋转循环。 如果我应该遵循第一种方式,为什么有些人编写代码遵循第二种方式?如果应该使用第二种方法,为什么要让当前线程Hibernate呢?这种方式的缺点是什么?
我正在编写一个基于await/sleep范式的网络绑定应用程序。 我更喜欢这样一个答案,不创建任何额外的线程
我正在使用Ruby和selenium webdriver gem创建一个web爬行/抓取脚本。我几乎完成了这个项目,但在某个点上卡住了,我正在抓取的站点用于对服务器的页面调用并显示一个字符串,问题是它显示了50%的时间,而不是100%。所以我需要循环get函数,直到它显示字符串。 我使用了隐式 我需要的是 好吧,我可以使用正常的睡眠10并且工作正常,但如果调用首先返回字符串,这是浪费时间
这里的要点是了解实现等待循环的更有效的解决方案,该循环在每次迭代时轮询条件。通过高效,我的意思是“有效的CPU调度”。 我知道代码中使用的等待条件不是“wakeOne”/“wakeAll”指令中使用的“真正的等待条件”,但我想知道对CPU来说,使用假等待条件是否比睡眠更有效。 这里有2个代码片段,它们做同样的事情:等待某些事情发生。这段代码用于工作线程池。因此,当一个线程等待时,其他线程(或其他一