2016-10-04 64 views
1

我注意到我正在测试的应用程序,当我点击一个提交按钮一个网格刷新。我有一个行数我有一个跨度访问,并希望做一些事情,如:看着ExpectedConditions类,试图找到onChange

(new WebDriverWait(driver, upperTimeoutLimit)) 
    .until(ExpectedConditions.elementChanged(By.cssSelector(mySelector))); 

我的目标是看一个节点,并做了WebDriverWait,直到它改变某种方式,理想的的getText

编辑我是说@FlorentB,他正沿着以下提的东西:

WebDriverWait wait = new WebDriverWait(driver, upperTimeoutLimit); 
WebElement grid = ui.getExternalCommandGrid(); 
submit.click(); 
//staleness 
System.out.println("about to check for staleness"); 
wait.until(ExpectedConditions.stalenessOf(grid)); 
System.out.println("About to check presence of"); 
wait.until(ExpectedConditions.presenceOfElementLocated(
    By.cssSelector(ui.getExternalCommandGridSizeSelector()))); 

它似乎没有获得通过的stalenessOf(网格)的一部分。我的想法可能是,我在点击之前选择网格,运行点击,然后希望在获得下一个拼图之前,它会等到它识别出一个变化(也许我需要检查行)。

+0

API本身有很多条件可以使用 - https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ ExpectedConditions.html ... 。textMatches,textToBe,\t textToBePresentInElement,textToBePresentInElementLocated,\t textToBePresentInElementValue等 – Grasshopper

+0

我可以用文本匹配来检查“textNotMatches”,不过是的,我一直在寻找的是API,并试图想我可以利用我的情况 – Fallenreaper

+0

结合起来与not()ExpectedCondition将会给你逻辑相反。 ExpectedConditions.not(ExpectedCondition.textMatches())应该诀窍 – Grasshopper

回答

0

我最终得到这个工作将是如下的方式:

//submit is a button. 
//driver is a WebDriver. 
//uppderTimeoutLimit is an int, 10000 
WebDriverWait wait = new WebDriverWait(driver, upperTimeoutLimit); 
WebElement sizeEle = driver.findElement(By.cssSelector(selector)); 
String beforeCount = sizeEle.getText(); 
submit.click(); 
System.out.println("about to wait until change"); 
wait.until(ExpectedConditions.not(ExpectedConditions.textMatches(
     By.cssSelector(selector), 
     Pattern.compile(beforeCount)))); 

它会超时,如果它没有改变,如果它,它会继续。现在我唯一能想到的就是用一种尝试来包装它,因为如果它超时,我想要一些人类可读的内容来理解为什么。

0

据我所知,selenium中没有像elementChanged这样的选项。你可以用你自己的方式做到这一点。首先,在点击提交按钮之前获取网格的行数。然后等待元素的数量大于先前的计数。

//count the grid's row before clicking submit button 
int previousRowCount = driver.findElements(By.cssSelector("your selector for row")).size(); 

//click submit button & wait for grid's row count to be greater than previousRowCount 
WebDriverWait wait = new WebDriverWait(driver, 20); 
wait.until(ExpectedConditions.numberOfElementsToBeMoreThan(By.cssSelector("your table rows locator"), numberCountBeforeTableLoad)); 

增加:

所有这些方法等待指定的参数的最大时间量。你无法等待你的页面/元素加载无限的时间。在我的一个项目中,有很多数据加载到表中。在排序数据时,表格消失。所以,我做了一个窍门。首先,我等待表格/行的隐形,然后等待最多5分钟的同一事物的可视性(是的,实际上是5个小时!!)。而且,它为我工作。

+0

这就是我现在做的,有一个更长的等待,问题是,网络请求需要不同的时间量,这是我我试图绕过。我试图通过一些更有活力的东西来避免等待很长时间。元素不止,不能工作,因为它是分页,所以每页最多有100行,如果是270行,如果页面重新加载,它不会显示行数改变。 – Fallenreaper

+0

如果行数减少或不变,该怎么办?元素可能已更新,但计数可能不会按照您的预期更改。你真的应该以不同的方式来做到安全。 – JeffC

+0

单击“提交”按钮后,表格/网格会消失吗?然后,分别等待表/表格行的隐藏和可见性。 –

1

一种简单的方式来等待网格被刷新会等待网格内的定位元素的陈旧程度:

WebDriverWait wait = new WebDriverWait(driver, 10); 

// element in grid 
WebElement element = driver.findElement(By.cssSelector(mySelector)); 

// trigger the reload 
button.click(); 

// waits for the element to become stale 
wait.until(ExpectedConditions.stalenessOf(element)); 

// waits for a new element 
element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(mySelector))); 
+0

什么是“陈旧”?我不确定它是如何定义的。我看到了它,但并不确定是否需要以某种方式切换。 – Fallenreaper

+0

'findElement'返回的结果是对页面中'HTMLElement'的引用。它存储在'WebElement.id'中。当文档重新加载或者元素从页面中删除或替换时,此引用变为陈旧(不再可用) 。 –

+0

哦,所以如果文字改变等等,它会变得陈旧?我要测试这个,然后如果它有效,这是我想要的答案。 – Fallenreaper