我正在尝试为这种情况找到合适的ExpectedConditions方法。我有一个图表,我想在重新排序图表后检查每行中的文本。问题是,当图表刷新时,文本仍然存在,它只是变灰了。因此,当我单击按钮以使图表重新排序时,然后查找我正在寻找的文本,测试失败,因为文本尚未更改。我不能使用visibilityOfElementLocated,因为当图表刷新时元素仍然可见,我只是在等待元素改变。
不确定是否有任何理由!!这是一个非常难以解释的问题。
一点背景:我正在使用Selenium Java并使用Chrome进行测试。到目前为止,这是我的方法。它工作正常,我只需要弄清楚如何让程序等待足够长的时间让图表刷新而不使用sleep语句。
非常感谢大家!我知道这不是很清楚,但如果您需要任何澄清,请告诉我。
public void Check_for_text_in_column(String text, String row, String column)
{
By by = By.xpath("//*[@id=\"table_Table_table_ktg\"]/tbody/tr[" + row + "]/td[" + column + "]/div/div/span");
WebDriverWait wait = new WebDriverWait(getWebDriver(), WAIT_TIME);
//This is the line that I need to change:
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(by));
if(!element.getText().equals(text))
{
fail("\nDid not find text: " + text + "\nFound text: " + element.getText() + "\n");
}
}
干杯!
答案 0 :(得分:4)
您可以替换
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(by));
与
WebElement element = wait.until(ExpectedConditions.textToBePresentInElement(by, text));
编辑:
您的WAIT_TIME
是您等待的超时时间。
如果预期条件在您根据true
超时之前未返回WAIT_TIME
,则element
将为null
。
所以,你的支票看起来像这样:
if(element == null)
{
fail("\nDid not find text: " + text + "\nFound text: " + element.getText() + "\n");
}
编辑:
也许另一种选择可能是这样的:
public void Check_for_text_in_column(String text, String row, String column)
{
By by = By.xpath("//*[@id=\"table_Table_table_ktg\"]/tbody/tr[" + row + "]/td[" + column + "]/div/div/span");
WebDriverWait wait = new WebDriverWait(getWebDriver(), WAIT_TIME);
// your original find
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(by));
// flag to set when text is found, for exiting loop
boolean hasText = false;
// counter for # of times to loop, finally timing out
int tries = 0;
// until text is found or loop has executed however many times...
while (hasText == false && tries < 20) {
// get the element
element = wait.until(ExpectedConditions.visibilityOfElementLocated(by));
// if text is not present, wait 250 millis before trying again
if(!element.getText().equals(text){
Thread.sleep(250);
tries++;
}
else{
// text found, so set flag to exit loop
hasText = true;
}
}
if(!element.getText().equals(text))
{
fail("\nDid not find text: " + text + "\nFound text: " + element.getText() + "\n");
}
}
我知道你说你不想要sleep
语句,但我认为你的意思是你只是不想要一个不必要的长句。即使ExpectedConditions
在内部使用sleep
也是如此。它们sleep
在轮询更改之间的时间间隔为几毫秒 - 而这正是它的作用,只是没有ExpectedCondition
类型的包装器。