我有一个包含可点击列标题的表格。首次单击时,列应按升序排序,第二次单击列应按降序排序。 使用异步回发更新面板实现了排序(我不确定它是如何完成的,它是一个aspx页面)。 我想使用Selenium Webdriver自动化排序功能。如何为不重新加载页面的页面实现WAIT条件,但只重新加载表格内容。 waitForElementPresent 不起作用,因为没有显示新元素或单击标题时隐藏。 PS:需要Java实现。
答案 0 :(得分:1)
我添加了一个与 jquery表相关的示例程序。以下是代码的执行流程:
相应地打印结果。
public class TestSortTable{
static WebDriver driver;
public static void main(String[] args){
driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.get("http://www.datatables.net/examples/basic_init/table_sorting.html");
//For Ascending in column "Position"
String result = clickAndWaitForChangeText(By.xpath("//table[@id='example']//th[2]"), By.xpath("//table[@id='example']//tr[1]/td[2]"), "Ascending");
if(result.contains("Fail"))
System.err.println(result);
else
System.out.println(result);
//For Descending in column "Position"
result = clickAndWaitForChangeText(By.xpath("//table[@id='example']//th[2]"), By.xpath("//table[@id='example']//tr[1]/td[2]"),"Descending");
if(result.contains("Fail"))
System.err.println(result);
else
System.out.println(result);
driver.close();//closing browser instance
}
//For clicking on header and waiting till the first text in the column changes
public static String clickAndWaitForChangeText(By Header_locator, By first_text_locator, String sortorder){
try{
String FirstText = driver.findElement(first_text_locator).getText();
System.out.println("Clicking on the header for sorting in: "+sortorder); //sortorder -> String representing sort order Ascending/Descending
driver.findElement(Header_locator).click();//Click for ascending/Descending
//Below code will wait till the First Text changes for ascending/descending
boolean b = new WebDriverWait(driver,10).until(ExpectedConditions.invisibilityOfElementWithText(first_text_locator, FirstText));
if(b==true){
return "Pass: Waiting Ends. Text has changed from '"+FirstText+"' to '"+driver.findElement(first_text_locator).getText()+"'";
}
else{
return "Fail: Waiting Ends. Text hasn't changed from '"+FirstText+"'.";
}
}catch(Throwable e){
return "Fail: Error while clicking and waiting for the text to change: "+e.getMessage();
}
}
}
注意:您可以在代码中相应地使用 clickAndWaitForChangeText 方法获取相关结果。
答案 1 :(得分:0)
你应该等到JQuery.active
返回0.我的是用c#编写的。除此之外,我们还可以等待您知道满足等待标准的特定元素。您可以使用fluentWait
或编写custom wait等待元素存在。
public void WaitForAjax()
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
wait.Until(d => (bool)(d as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"));
}
编辑: Java版
public void waitForAjaxLoad(WebDriver driver) throws InterruptedException{
JavascriptExecutor executor = (JavascriptExecutor)driver;
if((Boolean) executor.executeScript("return window.jQuery != undefined")){
while(!(Boolean) executor.executeScript("return jQuery.active == 0")){
Thread.sleep(1000);
}
}
return;
}
直接取自here