我有一个网页,在加载dom后,javascript继续在页面上运行并在页面上添加元素.在运行所有javascript之后,我触发了一个jquery事件page.loaded,以便在运行所有我的javascripts之后对页面上的组件感兴趣可以这样做.
我试图使用casperjs/phantomjs自动测试这个网页,我想在jQuery页面加载事件被触发后才检查页面上的元素.我应该怎么做呢?
以下是使用http://whatismyipaddress.com/proxy-check检查IP地址的代码
var casper = require("casper").create(),
utils = require('utils');
casper.userAgent('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0');
casper.start("http://whatismyipaddress.com/proxy-check", function() {
this.capture('0.png');
});
casper.on('remote.message', function(msg) {
this.echo('Remote: ' + msg);
})
casper.run(function() {
this.echo('End');
//finish execution script
this.exit();
});
Run Code Online (Sandbox Code Playgroud)
我键入casperjs --proxy="xxx.xxx.xxx.xxx:80" proxy.js
但截图正是我机器上的IP地址.
那么我怎么知道代理是坏的还是我的代码或命令行中出了什么问题呢?
我正在尝试使用CasperJS登录Meteor应用程序.
以下是我的casper脚本的样子:
var casper = require('casper').create({
verbose: true,
logLevel: 'debug'
});
casper.start('http://localhost:3000/', function() {
this.test.assertTitle('app', 'App title is as expected');
this.test.assertExists('#login-sign-in-link', 'Sign in link exists');
this.capture('step-1.png');
this.click('a#login-sign-in-link');
this.test.assertExists('#login-email', 'Email field found');
this.test.assertExists('#login-password', 'Password field found');
this.capture('step-2.png');
this.evaluate(function (username, password) {
document.querySelector('#login-email').value = username;
document.querySelector('#login-password').value = password;
}, {
username: 'a@b.com',
password: 'testtest'
});
this.capture('step-3.png');
this.click('div#login-buttons-password');
this.test.assertExists("a#login-name-link","Signed in");
this.capture('step-4.png');
});
casper.run();
Run Code Online (Sandbox Code Playgroud)
结果如下:
ubuntu:~/tmp/casper$ casperjs test meteor-login.js
Test file: meteor-login.js
[info] [phantom] Starting...
[info] [phantom] Running suite: 2 steps
[debug] [phantom] opening …Run Code Online (Sandbox Code Playgroud) 哪个是保存使用casperjs抓取网页时获得的表数据的最佳方法?
使用json对象并在序列化后将其存储为文件.
使用ajax请求到php然后将其存储在mysql数据库中.
我正在尝试填写表单的输入:
<form name="step_one_login_form" action="/" method="post">
<input type="hidden" name="form_name" value="step_one_login_form">
<input type="hidden" name="return_url" value="index.php?
<div id="haveaccount" style="display:block;">
<div class="panel_login">
<div class="panel_login_row">
<div class="panel_login_fieldname">
<label for="login_checkout" class="cm-required cm-trim cm-email">Email:</label>
<span class="panel_login_fieldabout">(Required)</span>
</div>
<div class="panel_login_field">
**<input type="text" id="login_checkout" name="user_login" size="30" value=""class="panel_login_textbox">**
Run Code Online (Sandbox Code Playgroud)
由于没有给出表单的类或id,我不明白这样做的方法.
所以我有一个在节点中运行的文件,它运行PhantomJS的本地副本,如下所示:
phantom.casperPath = 'node_modules/casperjs';
phantom.injectJs('node_modules/casperjs/bin/bootstrap.js');
var casper = require('casper').create({
viewportSize: config.viewportSize
});
casper.test.begin('Runing tests here', 5, function suite(test) {
// Tests here
});
Run Code Online (Sandbox Code Playgroud)
没有casper.test.begin()我的测试功能很好.我有正确的版本1.1.0,可以使用此测试套件,但我在我的控制台中收到以下错误:
CasperError: casper.test property is only available using the `casperjs test` command
Run Code Online (Sandbox Code Playgroud)
CasperJS文档也提到了这一点:http://docs.casperjs.org/en/latest/testing.html .我的问题是如何在上面的代码中使用此命令运行此Casper,以便我可以使用这些测试?
谢谢!
我正在使用CasperJS自动填写在线表格.每当您尝试提交填写了包含无效数据的任何必填字段的表单时,每个包含无效数据的字段都会显示一条错误消息,提醒您问题所在.我想收集所有这些消息并将它们连接成一个 - 无论是通过数组还是其他方法对我来说都无关紧要.错误消息的CSS如下所示:
<span class="field-validation-error" data-valmsg-replace="true" data-valmsg-for="Name.Last">
<span class="" for="Name_Last" generated="true">
The Last Name field is required.
</span>
</span>
Run Code Online (Sandbox Code Playgroud)
<span class="field-validation-error" data-valmsg-replace="true" data-valmsg-for="Address.City">
<span class="" for="Address_City" generated="true">
The City field is required.
</span>
</span>
Run Code Online (Sandbox Code Playgroud)
在浏览器控制台中,我成功地做到了这一点:
var arr = document.querySelectorAll('.field-validation-error');
for (var i = 0; i < arr.length; i++) {
var err = arr[i]; console.log(err.textContent);
}
Run Code Online (Sandbox Code Playgroud)
它让我回复:
"The Last Name field is required."
"The City field is required."
Run Code Online (Sandbox Code Playgroud)
我打算在CasperJS中做同样的事情,但我无法得到相同的结果.这是我的代码到目前为止(一个更大的文件的片段,所以我不会发布我casper.start或任何东西):
var results = self.evaluate(function() {
var arr = document.querySelectorAll('.field-validation-error');
return …Run Code Online (Sandbox Code Playgroud) 我的CasperJS脚本永远不会停止执行.
var casper = require('casper').create();
casper.userAgent('Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36');
casper.start('https://www.google.co.in/',function(){
casper.wait(3000,function(){
this.echo(this.getTitle());
});
});
casper.run();
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用CasperJS测试页面.是否有可能获得包含属性数据-...的每个元素(段落)?之后,我需要将此属性与内部HTML进行比较,但我不知道该怎么做.
在填充之前有没有办法用CasperJS或PhantomJS清除输入字段?
我已经尝试过sendKeys('input_field', "data", clear:true);并fill运行了函数,但是所有这些函数都只是附加了输入字段而不是之前清除它.