如何使用Protractor下载弹出窗口中的ASPX页面?代码求助
Hey there! 看你已经把Mahabhulekh网站的自动化流程走通大半了,就差最后弹出窗口里ASPX页面的下载功能了对吧?我来给你一步步搞定这个问题:
解决Protractor中弹出窗口ASPX页面的下载问题
1. 先切换到弹出的新窗口
点击"७/१२ पहा"按钮后会打开新窗口,但Protractor默认只会在原窗口操作,所以第一步必须切换到新窗口才能继续:
element.all(by.partialButtonText("७/१२ पहा")).first().click().then(function () { // 先等窗口加载完成(这里可以用browser.wait替代sleep,更稳定,后面会说) browser.sleep(10000); // 获取所有打开的窗口句柄 browser.getAllWindowHandles().then(function(handles) { const originalWindow = handles[0]; const newWindow = handles[1]; // 假设新窗口是第二个,要是不对可以遍历验证 // 切换到新窗口 browser.switchTo().window(newWindow); // 接下来在这里处理下载逻辑 }); });
如果担心窗口顺序不对,可以通过标题来定位目标窗口,更稳妥:
browser.getAllWindowHandles().then(function(handles) { handles.forEach(function(handle) { browser.switchTo().window(handle); browser.getTitle().then(function(title) { // 替换成你目标窗口的标题关键词 if(title.includes("7/12 Extract")) { // 找到目标窗口了,后续操作就在这里 } }); }); });
2. 选择适合你的下载方式
根据弹出的ASPX页面的实际情况,有几种常见的实现方式:
方式一:页面有明确的下载按钮
如果弹出页面里有下载按钮,直接定位点击就行:
// 切换到新窗口后 element(by.id('downloadBtn')).click(); // 替换成实际的下载按钮选择器,比如css/xpath
方式二:直接保存页面源码为本地文件
如果ASPX页面直接展示了你需要的内容(比如7/12表格),可以获取页面源码然后用Node.js的fs模块保存到本地:
首先在测试文件顶部引入fs模块:
const fs = require('fs');
然后在切换到新窗口后添加:
browser.getPageSource().then(function(pageSource) { // 把页面源码保存为本地ASPX文件 fs.writeFileSync('./downloaded_712.aspx', pageSource, 'utf8'); console.log('ASPX页面已经成功保存到本地啦!'); });
方式三:配置浏览器自动下载文件
如果点击后会触发浏览器的下载弹窗,需要提前在Protractor配置里设置自动下载,不用手动确认:
在你的protractor.conf.js里添加Chrome的配置(其他浏览器类似):
exports.config = { // 其他配置项... capabilities: { browserName: 'chrome', chromeOptions: { prefs: { 'download.default_directory': '/Users/yourname/Downloads/protractor_downloads', // 替换成你的目标下载目录 'download.prompt_for_download': false, // 不弹出下载提示框 'download.directory_upgrade': true, 'safebrowsing.enabled': true } } } };
配置好后,切换到新窗口触发下载操作,浏览器就会自动把文件保存到指定目录了。
3. 可选:切换回原窗口
如果后续还要操作原网站页面,记得切回去:
browser.switchTo().window(originalWindow);
完整修改后的代码
把上面的逻辑整合到你的现有代码里,最终版本大概是这样:
const fs = require('fs'); describe('Mahabhulekh 7/12 Extract Automation', function() { it('should complete workflow and download ASPX page', function() { browser.get('https://mahabhulekh.maharashtra.gov.in/'); element(by.partialLinkText('अमरावती')).click(); browser.sleep(5000); var allcount = element.all(by.options('v as t for (v,t) in names')).count(); expect(allcount).toEqual(6); element.all(by.options('v as t for (v,t) in names')).then(function(options) { options[1].click(); browser.sleep(5000); element(by.model("talCode")).$('[value="number:7"]').click(); browser.sleep(5000); element(by.model("vilCode")).$('[value="string:270400070038950000"]').click (); browser.sleep(5000); element(by.id('rbsryno')).click(); browser.sleep(5000); element(by.model("sno")).sendKeys("10"); browser.sleep(5000); element.all(by.partialButtonText('शोधा')).get(1).click(); browser.sleep(5000); element(by.model("selectedSno")).$('[value="string:10"]').click(); browser.sleep(5000); element.all(by.partialButtonText("७/१२ पहा")).first().click().then(function () { browser.sleep(10000); // 切换到新窗口 browser.getAllWindowHandles().then(function(handles) { const newWindow = handles[1]; browser.switchTo().window(newWindow); // 这里选择保存页面源码的方式,你可以换成其他下载逻辑 browser.getPageSource().then(function(pageSource) { fs.writeFileSync('./downloaded_712.aspx', pageSource, 'utf8'); console.log('ASPX页面已成功下载保存!'); }); // 可选:切换回原窗口 // browser.switchTo().window(handles[0]); }); }); }); }); });
小提示
尽量用browser.wait()代替browser.sleep(),固定睡眠容易因为网络或页面加载慢出问题,比如等待新窗口出现可以这么写:
browser.wait(function() { return browser.getAllWindowHandles().then(function(handles) { return handles.length > 1; }); }, 15000); // 最多等15秒
内容的提问来源于stack exchange,提问作者user1358401
相关产品推荐
相关产品推荐

