You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:36:32