【问题标题】:Webdriver how to fetch updated HTML post AJAX event?Webdriver如何获取更新的HTML发布AJAX事件?
【发布时间】:2013-07-11 20:39:19
【问题描述】:

我需要在自动化测试期间评估 DOM 树。

最初在打开链接时,Web 应用程序正在加载 100 条记录。 AJAX 请求加载 400 多个记录后的 Click() 事件。

 WebDriver obj = new FirefoxDriver();
 obj.get("https://localhost/WebApplication");
 WebElement loadAllLinkEle = obj.findElement(By.cssSelector("a[class=load-all]"));
 loadAllLinkEle.click();
 Document doc = Jsoup.parse(obj.getPageSource(), "UTF-8");
 System.out.println(doc.html());

当我尝试打印文档时,它的打印 OLD html,即在调用 Click 事件之前加载的 html。

如何获取更新后的 DOM 树?

【问题讨论】:

  • 我认为 DOM 只是在解析时没有更新。试试wait till the Ajax call is finished
  • 但是我可以在点击事件之后调用这个方法吗?
  • 当然!为什么不?试试看;)

标签: java dom selenium webdriver automated-tests


【解决方案1】:

试试这个:

WebElement element = driver.findElement(By.xpath("//*"));
String code = element.getAttribute("outerHTML");

【讨论】:

    【解决方案2】:

    以下解决方案有效。

    try {
        Thread.sleep(1000);
    } catch(InterruptedException ex) {
        Thread.currentThread().interrupt();
    }
    
    WebElement myDynamicElement = (new WebDriverWait(obj, 10)).until(ExpectedConditions.presenceOfElementLocated(By.id("container")));;
    

    【讨论】:

    • 为什么是 Thread.sleep?如果 WebDriverWait 正在为 id=container 的元素池化,你在睡觉是为了什么?如果这还不够,请增加 webdriverwait 超时,但不要睡觉。 webdriverwait 的重点是完全避免这种非常脆弱的睡眠。你永远不知道睡眠是否足够,可能更少,也可能更多。
    • 解决方案非常符合我的要求。我的页面没有包含太多 ID。至少在 AJAX 调用之后,没有添加新的 ID。所以我做了这个解决方法。Container 是第一次加载页面时加载的 ID。
    • 好的,那么您的解决方案中的 webdriverwait 不一定能解决您的问题。因此,这个解决方案是有缺陷的。您确定单击按钮时会插入 400 行吗?或者,您也可以使用内部 java 脚本。
    • 免责声明:- 我是自动化测试的新手。是的,我相信新数据会到来。所以你现在我的要求那么你能建议标准解决方案吗?只有一个限制,我们不能在Application中添加任何测试JS脚本。我们希望在不触及代码库的情况下自动执行此操作。我很乐意学习。
    • 当然。您知道单击时将添加的确切行数吗?在处理此类情况时,使用开发人员的内部挂钩也完全可以。浏览器模拟是一个很难解决的问题。
    猜你喜欢
    • 2013-05-07
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多