我目前有以下设置,但我不确定我的等待(隐式和pageLoadTimeout)是否有效。--这是正确的实现吗?通过将它放在@(“@setup”)中,它对每个场景或步骤定义运行都有效吗?司机会相应地等待吗,每次我打电话给@Given,@When..etc?
@Before("@setup")
public void setUp() {
driver.manage().deleteAllCookies();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
}为什么有必要为下面的等待分配一个WebElement,WebElement元素收到了什么?这样做对吗?-
WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));
boolean status = element.isDisplayed();发布于 2018-05-25 07:56:20
implicitlyWait()
implicitlyWait()是告诉WebDriver实例,即驱动程序在试图查找一个或多个元素(如果它们不是立即可用的话)时轮询HTML DOM一段时间。默认等待配置设置为。一旦设置,隐式等待就会被设置为WebDriver对象实例的生命周期。
您的代码测试非常完美,如下所示:
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);在这里,您将在在selenium中使用隐式等待中找到详细的讨论。
pageLoadTimeout()
pageLoadTimeout()将timespan设置为在抛出错误之前等待页面加载完成。
您的代码测试非常完美,如下所示:
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);在这里,您可以在硒中的pageLoadTimeout不起作用中找到详细的讨论
备注:尽量避免配置
pageLoadTimeout(),直到并且除非测试规范明确提到了相同的内容。
为什么是WebDriverWait?
现代浏览器使用JavaScript、阿贾克斯和React Native,其中网页中的元素被加载为阿贾克斯。因此,在继续执行下一行代码显式等待 (即WebDriverWait )之前,等待满足特定条件是前进的方式。
备注:根据显性和隐式Waits的官方文档,不要将隐式和显式等待混为一谈。这样做会导致不可预测的等待时间。
您的代码试用版非常适合等待元素的可见性,如下所示:
WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));在这里您可以找到关于用显式等待替换隐式等待(selenium & java)的详细讨论。
你的具体问题
boolean status = element.isDisplayed(); )是多余的,因为一旦元素是可见的,visibilityOfElementLocated()就返回该元素(也就是说,元素不仅显示,而且高度和宽度大于)。发布于 2018-05-25 08:25:26
如果您刚刚开始使用selenium,这是一个合法的问题。我总是建议去看看官方医生。
一个隐含的等待是告诉WebDriver在试图查找一个或多个元素(如果它们不是立即可用的话)时,对DOM进行一定时间的轮询。默认设置为0。一旦设置,隐式等待就会被设置为WebDriver对象实例的生命周期。
示例:
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));在这种情况下,如果在尝试定位时,带有id myDynamicElement的web元素不在DOM中,则需要重试到10秒。轮询时间取决于您正在使用的webdriver。您必须知道的是,它将尝试在10秒内找到元素。当然,如果元素在这段时间结束之前被定位,那么代码将继续进行。否则,将引发异常。
显式等待是指在代码中进一步进行之前,您定义的等待某个条件发生的代码。最坏的情况是Thread.sleep(),它将条件设置为等待的确切时间。有一些方便的方法可以帮助您编写只在需要时等待的代码。WebDriverWait与ExpectedCondition的结合是实现这一目标的一种方法。
示例:
WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));这将在抛出TimeoutException之前等待10秒,或者如果它找到该元素,则将在0-10秒内返回它。默认情况下,WebDriverWait每500毫秒调用一次ExpectedCondition,直到它成功返回为止。ExpectedCondition函数类型的成功返回值是真的布尔值,或非空对象。
最后是这样写的:这个例子在功能上也等同于第一个隐式Waits示例.
因此,如果您使用presenceOfElementLocated作为预期条件(对于您试图定位的每个元素),则使用隐式等待完全相同。但这不仅仅是条件。从ExpectedConditions中可以看到,您可以指定其他条件(例如: elementToBeClickable、stalenessOf等)。
所以,回到你的问题:
使用
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);您是说等待,,每当尝试找到a元素,presence (记住,它就像presenceOfElementLocated),直到30秒。
使用
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);您设置为30秒,即网页需要加载的时间。
通过以下方式:
WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));
boolean status = element.isDisplayed();您是说您想要等待带有id:"id“的web元素的visibilityOfElementLocated,,直到30秒。
最后:
为什么有必要为下面的等待分配一个WebElement,WebElement元素收到了什么?这是正确的实施吗?
WebElement元素接收到什么?如果没有id,还有什么?当然,如果它是可见的。否则,将引发异常。
发布于 2018-05-24 23:52:22
在这种情况下,您只需要等待页面加载,您的实现就可以了。@ one是Cucumber Hooks之一,它意味着您的方法将在每个场景之前运行。我建议使用fluent wait而不是webdriverwait,原因如下:
当使用FluentWait实例时:
例如:
// Waiting 30 seconds for an element to be present on the page, checking for its presence once every 5 seconds.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) .withTimeout(30, SECONDS) .pollingEvery(5, SECONDS).ignoring(NoSuchElementException.class);希望我帮了你。
https://stackoverflow.com/questions/50518467
复制相似问题