无法使用CasperJS填充没有表单的输入元素

时间:2014-01-28 21:35:37

标签: javascript html casperjs

使用CasperJS我正在尝试模拟一个用户操作,该操作包括将xml文件导入到使用backbonejs编写的单页Web应用程序中:try.activeeon.com

1)用户点击“导入”,这是一个“a”html标签

<a id="import-button" href="#" class="pointer"><i class="glyphicon glyphicon-import"></i> Import</a>

2)用户在对话框中选择一个文件,该文件由没有“表单”的“输入”html标签处理

<input type="file" id="import-file" style="display:none"/>

3)网络应用程序加载文件的内容

现在使用CasperJS我的脚本等待,直到使用waitForResource()加载页面然后使用thenClick模拟用户单击然后使用evaluate()通过调用setAttribute设置“input”html标记的值并调用click()但是没有发生了,我尝试使用fill(),似乎没有办法填写输入没有“名称”属性,捕获的截图始终是空的,似乎网络应用程序没有反应...我也尝试过在click()之后在input元素上调度“change”事件而没有任何影响。

var casper = require('casper').create({
    verbose: true,
    logLevel: "debug"
});

var x = require('casper').selectXPath;

casper.on('remote.message', function(msg) {
    this.echo('remote message caught: ' + msg);
});

casper.start('http://try.activeeon.com/studio/', function() {
    this.echo("Page title: " + this.getTitle());
    this.viewport(1366, 768);
});

casper.waitForResource("gears.png", function() {
    this.echo('gears.png has been loaded.');        
});

casper.thenClick('a[id="import-button"]', function() {    

    this.wait(2000, function(){

       this.evaluate(function(){
            var inputElement = document.querySelector('input#import-file');        
            try {
                inputElement.setAttribute('value', 'file.xml');            
                inputElement.click();
            } catch(err) {
                console.log("---> oups " + err);
            }        
        });

        this.echo('-----------------------------------------');

        //this.page.uploadFile('input#import-file','file.xml'); 
        this.fill('input#import-file', {}, true);

        this.echo('-----------------------------------------');

        this.wait(2000, function() {

            this.capture('test-image.jpg', {
                top: 0,
                left: 0,
                width: 1366,
                height: 768
            });
        });
    });        
});

casper.run();

1 个答案:

答案 0 :(得分:-1)

还有一个名为evaluate()

的fill()方法的替代方法

http://docs.casperjs.org/en/latest/modules/casper.html#evaluate