这是我的第一个casper测试,所以我仍然在努力学习基础知识.我想在登录表单上填写用户名和密码,然后提交.然后确认下一页是否显示"注销"链接(确认用户已登录).
但据我所知,当再被调用,URL仍然是相同的.看起来没有帖子或重定向到下一页正在发生.我究竟做错了什么?
casper.start "http://test.local.mycompany.local/", ->
@echo 'at ' + @getCurrentUrl()
@fill 'form', { UserAlias : 'joe', Password : 'password' }, true
casper.then ->
@echo 'at ' + @getCurrentUrl()
@test.assertExists '#log-off-link', 'log-off link exists'
casper.run ->
@test.done()
Run Code Online (Sandbox Code Playgroud)
所以@getCurrentUrl的回显都返回相同的URL,这是错误的.
如何测试我的页面上的警告框被调用?我可以抓住警报框的文本并进行评估吗?
我在CasperJS中的点击是这样完成的:
casper.waitForSelector('a[href="javascript:UserLogin()"]',
function success() {
this.test.comment("Submiting the bad login info");
this.test.assertExists('a[href="javascript:UserLogin()"]');
this.click("a#h_login");
},
function fail() {
this.test.assertExists('a[href="javascript:UserLogin()"]');
});
Run Code Online (Sandbox Code Playgroud)
UserLogin函数检查,在这种情况下,返回:
alert('Login has failed.');
Run Code Online (Sandbox Code Playgroud)
我该如何检查?
几天前刚刚开始与CasperJS合作.
我今天创建了一个脚本来测试LocalStorage的行为方式以及是否可以禁用它,因为这是为了防止测试相互影响.
背景
我正在开发一个在第一页上要求输入值的Backbone向导.单击"继续"按钮时,它会将值保存到LocalStorage,然后在第二页上显示.
我casperjs test <script.js>有和无用--local-storage-quota=0.
第一次尝试
写了一个执行以下操作的CasperJS脚本:
如果启用了LocalStorage,则步骤6应与步骤4具有相同的结果(模型中存在值).
如果禁用了LocalStorage,则步骤6应与步骤2具有相同的结果(模型为空).
每次运行脚本时,我都确定已启用LocalStorage.'--local-storage-quota = 0'参数没有任何区别.
第二次尝试
此时,我决定确定LocalStorage是否附加到特定的Casper实例.如果是这样,那么我可以通过为每个测试创建一个新的Casper实例来解决这个问题,从而从一个干净的平板开始.
var Casper = require( 'casper' );
casper = Casper.create();
casper.test.begin( 'test for Local Storage, part 1', 0, function suite (test) { ... });
casper = Casper.create();
casper.test.begin( 'test for Local Storage, part 2', 0, function suite (test) { ... });
Run Code Online (Sandbox Code Playgroud)
但是,第二个测试套件永远不会运行.我不知道Casper是不打算在同一个脚本中创建多个实例,或者我是否只是错误地组织它.
附录
我应该补充说,所有测试套件都以以下步骤结束,以防相关:
casper.run( function () {
test.done();
casper.exit();
});
Run Code Online (Sandbox Code Playgroud)
文档仅指定test.done()是必需的.但是,我的测试脚本将永远挂起,直到我将调用添加到casper.exit().
我需要下载以下网页:http://m.10bet.com/#leage_panel#10096
这是一个体育博彩页面,我需要报价.所以,首先这看起来很简单.但是,这是发生的事情(您可以使用例如浏览器的开发人员工具来检查):
相反,我需要使用能够评估javascript的无头浏览器.HtmlUnit for java是不够的,因为它不提供强大的javascript功能.因此,PhantomJS与CasperJS的结合是我目前的选择.我使用以下脚本应用CasperJS:
var casper = require('casper').create();
casper.start('http://m.10bet.com/#leage_panel#10096', function() {
var url = 'http://m.10bet.com/#leage_panel#10096';
this.download(url, '10bet.html');
});
casper.run(function() {
this.echo('Done.').exit();
});
Run Code Online (Sandbox Code Playgroud)
但是,此脚本不会加载整个页面.只是初始页面.如何加载浏览器中显示的完整网页?

好吧,我可以通过指定slimer.bat文件的路径来启动slimerjs:C:\ bin\slimerjs\slimerjs.bat然后执行我的文件.
但是如果我修改casperjs文件(在bin \中)并修改slimer的默认exec:
'env_varname': 'SLIMERJS_EXECUTABLE',
'default_exec' : 'C:\bin\slimerjs\slimerjs.bat'
Run Code Online (Sandbox Code Playgroud)
当我执行casper命令时:
casperjs --engine=slimerjs test.js
Run Code Online (Sandbox Code Playgroud)
它不起作用,slimerjs.bat的路径似乎被忽略了.
我也试过了:https://github.com/laurentj/slimerjs/blob/master/BUILD.md
但单独的slimerjs.exe是不够的,我需要在我正在执行我的测试的当前文件夹中有application.ini和omni.ja,我不想在每个文件夹中添加一些文件.
我想要的只是在casperjs中使用引擎属性执行slimerjs,无论我在哪个文件夹,就像在phantomjs中所以我需要设置一个绝对路径(或从root的相对路径).
我不想在slimerjs.bat文件夹中指定我想要执行的文件夹或js测试:casperjs test C:/bin/try/test.js --engine = slimerjs.
这里有一个类似的问题:https: //github.com/n1k0/casperjs/issues/591
编辑(感谢Darren Cook的回答)了解更多详情:
set PATH=%PATH%;C:\\bin\\slimerjs
Run Code Online (Sandbox Code Playgroud)
如果我为slimer设置Windows PATH,当我执行casperjs test --engine = slimerjs test.js时,我有这样的消息:

但是在test.js文件夹中添加这两个文件可以解决问题.

所以我想我必须修改slimerjs bat文件,从slimerjs.bat文件夹设置:callexec路径,而不是当前的test.js文件夹.
这里 :
:callexec
if ["%HIDE_ERRORS%"]==[""] (
%SLIMERJSLAUNCHER% -app "%SLIMERDIR%application.ini" %PROFILE% -attach-console -no-remote %__SLIMER_ARGS%
) ELSE (
%SLIMERJSLAUNCHER% -app "%SLIMERDIR%application.ini" %PROFILE% -attach-console -no-remote %__SLIMER_ARGS% 2>NUL
)
Run Code Online (Sandbox Code Playgroud)
用:
SET SLIMERDIR=%~dp0
Run Code Online (Sandbox Code Playgroud)
问题是我不熟悉这种语法(批处理文件),它可能已经是正确的,问题不是来自这里.
但我观察到它似乎从当前文件夹中寻找application.ini和omni.ja,而不是slimerjs文件夹.
PS:第二个想法不起作用,但现在我知道它来自slimerjs.
编辑:
REM % ~ d[rive] …Run Code Online (Sandbox Code Playgroud) 我想了解在哪种情况下我应该或必须使用该evaluate功能.
我已经阅读了有关evaluateCasperJS功能的API文档,但我不确定在哪种情况下我应该使用这个函数.DOM上下文是什么意思?有人可以提供一个例子吗?
我正在尝试使用CasperJS连接到SoundCloud。有趣的是,一旦您登录并稍后重新运行登录功能,以前的登录仍处于活动状态。在继续之前,这里是代码:
casper.thenOpen('https://soundcloud.com/', function() {
casper.click('.header__login');
popup = /soundcloud\.com\/connect/;
casper.waitForPopup(popup, function() {
casper.withPopup(popup, function() {
selectors = {
'#username': username,
'#password': password
};
casper.fillSelectors('form.log-in', selectors, false);
casper.click('#authorize');
});
});
});
Run Code Online (Sandbox Code Playgroud)
如果您至少运行两次此代码,您应该看到以下错误出现:
CasperError: Cannot dispatch mousedown event on nonexistent selector: .header__login
Run Code Online (Sandbox Code Playgroud)
如果您分析日志,您将看到第二次,您将被重定向到https://soundcloud.com/stream,这意味着您已经登录。
我做了一些研究来清除每个测试之间的环境,但是似乎以下几行代码无法解决问题。
phantom.clearCookies()
casper.clear()
localStorage.clear()
sessionStorage.clear()
Run Code Online (Sandbox Code Playgroud)
从技术上讲,我真的很想了解这里发生的事情。也许SoundCloud构建了一个系统,还可以在服务器端存储一些变量。在这种情况下,我必须先注销才能登录。但是我的问题是,如何才能完美隔离并清除每个测试之间的所有内容?有人知道每次测试之间如何使环境无符号吗?
发生故障时是否有办法继续测试套件?举例:
casper.test.begin("",3,function suite(){
casper.start(url).then(function(){
test.assert(...);
test.assert(...); //If this assert fail, the script stop and the third assert isn't tested
test.assert(...);
}).run(function(){
test.done();
});
});
Run Code Online (Sandbox Code Playgroud)
我希望所有断言都经过测试,即使有些失败.可能吗?
<a href="pss.exe?TRANSACTION=CGI_JUMP&SESSDATA=randomstuff&SKIN=default&LANG=en-US">
Change passwords
</a>
<a href="psk.exe?TRANSACTION=CGI_JUMP&SESSDATA=randomstuff&SKIN=default&LANG=en-US">
Unlock accounts
</a>
Run Code Online (Sandbox Code Playgroud)
一个链接有一个pss.exe,另一个链接有psk.exe
InnerText是"更改密码"或"解锁帐户"
那么如何点击"更改密码"链接.A标签没有类或名称,也没有任何简单的方法可供我使用css选择器.
我是Angular 4的新手,我刚刚通过Angular Cli创建了一个项目,我得到了错误
Uncaught TypeError: useValue,useFactory,data is not iterable!
Run Code Online (Sandbox Code Playgroud)
我无法解决它.我安装并重新安装了cli,我只是想知道如何解决它.我所做的只是
ng new myprj
mkdir myprj
ng serve
Run Code Online (Sandbox Code Playgroud) casperjs ×10
phantomjs ×5
javascript ×4
testing ×3
ajax ×1
angular ×1
assert ×1
coffeescript ×1
exe ×1
html ×1
karma-runner ×1
node.js ×1
slimerjs ×1
spookyjs ×1
tdd ×1
web-scraping ×1