如何在Selenium中获取AJAX调用返回值以验证动态链接?
解决Selenium中获取AJAX调用返回值的问题
嘿,我明白你现在的难题——你用$.get发起AJAX请求,但因为它是异步的,直接用executeScript根本拿不到返回值对吧?别着急,我给你两个可行的方案,其中第一个是更推荐的做法:
方案1:用executeAsyncScript处理异步请求(推荐)
Selenium专门提供了executeAsyncScript来处理异步操作,它会等你调用一个回调函数来通知它“异步操作完成了”,然后把结果返回给Java代码。正好适配AJAX的异步特性,不会阻塞浏览器,性能也更好。
直接上代码:
JavascriptExecutor jse = (JavascriptExecutor) driver; // 用executeAsyncScript替代executeScript String dynamicUrl = (String) jse.executeAsyncScript( "// 拿到Selenium传入的回调函数,存在callback变量里" + "var callback = arguments[0]; " + "// 发起AJAX请求,拿到结果后调用回调把值传回去" + "$.get('/User/GetDynamicURL/', function(result) { " + " callback(result); " + "});" ); // 现在你就可以用dynamicUrl和页面上的链接做比对啦 System.out.println("从服务器拿到的正确URL:" + dynamicUrl);
简单解释下:arguments[0]是Selenium自动传给JS代码的回调函数,当AJAX请求成功拿到结果后,调用这个回调函数把result传回去,Selenium就会等待这个动作完成,然后把result作为executeAsyncScript的返回值给到Java这边。
方案2:把AJAX改成同步(不推荐)
如果实在不想用executeAsyncScript,也可以把jQuery的AJAX请求改成同步模式,但这个方法会阻塞浏览器直到请求完成,会拖慢测试速度,所以不太推荐在实际测试里用。
代码示例:
JavascriptExecutor jse = (JavascriptExecutor) driver; String dynamicUrl = (String) jse.executeScript( "var result; " + "$.ajax({ " + " url: '/User/GetDynamicURL/', " + " async: false, // 关键:把异步改成同步 " + " success: function(data) { " + " result = data; " + " } " + "}); " + "return result;" ); System.out.println("获取到的动态URL:" + dynamicUrl);
这里设置async: false后,JS代码会等到AJAX请求完全结束才会执行return result,这样Selenium就能拿到返回值了,但代价是浏览器在请求期间会卡住,所以还是优先用方案1哈。
额外注意点
- 要确保测试的页面已经加载了jQuery,如果页面没引入jQuery的话,要么让页面加上,要么改用原生的
XMLHttpRequest来写AJAX请求。 - 如果服务器返回的是JSON对象而不是纯字符串,你可以在JS里把它转成字符串(比如
JSON.stringify(result))再返回,或者在Java里把返回值转成对应的JSON对象来处理。
内容的提问来源于stack exchange,提问作者KazKazar
相关产品推荐
相关产品推荐

