Selenium with PhantomJS:表单正在验证但未提交
Selenium with PhantomJS: Form being validated but not submitted
我通过Selenium Webdriver的PhantomJS API提交表单时遇到了一个奇怪的问题。单击提交按钮后,表单将得到验证(用户名和密码是否太短,或空白等),但最终不会提交。也就是说,如果我提交无效的表单,并检查屏幕截图,则会出现警报通知。如果我提交有效的表格,则没有任何反应。页面上的JS应该验证表单,然后在单击提交按钮时提交表单。
有几个排除。我已经在提交按钮上尝试了.click()
和.submit()
,这是一个按钮元素。我还尝试.submit()
表单本身和表单中的任意元素(如密码),Selenium 允许这样做。
事实上,如果我驾驶的是Firefox而不是PhantomJS,同样的代码就可以了。不过,我宁愿不切换,因为Firefox速度较慢,并且给我带来了不可预测的连接问题。
我的规格:我在Ubuntu 14.04 LTS(GNU/Linux 3.17.1-elastic x86_64)上通过Python 2.7使用Selenium版本1.43和PhantomJS 1.98。
下面的代码。首先是我的硒代码。然后是表单的 html。然后从站点登录.js源代码。我认为 js 中发生的事情是,由于某种原因,正在运行来自 .validate
函数的invalidHandler
,但submitHandler
没有?提前感谢您的关注。
# enter username and password up here first
submitEl = self.find_element_by_css_selector("button[type='submit']")
submitEl.click()
self.save_screenshot('login_submission.png')
Edit2:"self"是从Webdriver.PhantomJS
类继承的驱动程序对象。现在表单 html:
<form class="form-login" action="" name="login" method="POST">
<div class="errorHandler alert alert-danger no-display">
<i class="fa fa-remove-sign"></i> You have some form errors. Please check below.
</div>
<fieldset>
<div class="form-group">
<span class="input-icon">
<input type="text" class="form-control" name="username" placeholder="Username">
<i class="fa fa-user"></i> </span>
</div>
<div class="form-group form-actions">
<span class="input-icon">
<input type="password" class="form-control password" name="password" placeholder="Password">
<i class="fa fa-lock"></i>
<a class="forgot" href="forgot.php">
I forgot my password
</a> </span>
</div>
<div class="form-group">
<img src="captcha/captcha.php" alt="captcha" />
<span class="input-icon" style="width:200px; float: right;">
<input type="text" class="form-control" name="captcha">
<i class="fa fa-key"></i> </span>
</div>
<div class="form-actions" ><div class="slideExpandUp">
<label for="remember" class="checkbox-inline">
<input type="checkbox" class="grey remember" id="remember" name="remember">
Keep me signed in
</label>
<button type="submit" class="btn btn-bricky pull-right" name="submit">
Login <i class="fa fa-arrow-circle-right"></i>
</button></div>
</div>
<div class="new-account">
Don't have an account yet?
<a href="register.php" class="register">
Create an account
</a>
</div>
</fieldset>
</form>
登录.js
var Login = function () {
var runSetDefaultValidation = function () {
$.validator.setDefaults({
errorElement: "span", // contain the error msg in a small tag
errorClass: 'help-block',
errorPlacement: function (error, element) { // render error placement for each input type
if (element.attr("type") == "radio" || element.attr("type") == "checkbox") { // for chosen elements, need to insert the error after the chosen container
error.insertAfter($(element).closest('.form-group').children('div').children().last());
} else if (element.attr("name") == "card_expiry_mm" || element.attr("name") == "card_expiry_yyyy") {
error.appendTo($(element).closest('.form-group').children('div'));
} else {
error.insertAfter(element);
// for other inputs, just perform default behavior
}
},
ignore: ':hidden',
highlight: function (element) {
$(element).closest('.help-block').removeClass('valid');
// display OK icon
$(element).closest('.form-group').removeClass('has-success').addClass('has-error').find('.symbol').removeClass('ok').addClass('required');
// add the Bootstrap error class to the control group
},
unhighlight: function (element) { // revert the change done by hightlight
$(element).closest('.form-group').removeClass('has-error');
// set error class to the control group
},
success: function (label, element) {
label.addClass('help-block valid');
// mark the current input as valid and display OK icon
$(element).closest('.form-group').removeClass('has-error');
},
highlight: function (element) {
$(element).closest('.help-block').removeClass('valid');
// display OK icon
$(element).closest('.form-group').addClass('has-error');
// add the Bootstrap error class to the control group
},
unhighlight: function (element) { // revert the change done by hightlight
$(element).closest('.form-group').removeClass('has-error');
// set error class to the control group
}
});
};
var runLoginValidator = function () {
var form = $('.form-login');
var errorHandler = $('.errorHandler', form);
form.validate({
rules: {
username: {
minlength: 2,
required: true
},
password: {
minlength: 6,
required: true
}
},
submitHandler: function (form) {
errorHandler.hide();
form.submit();
},
invalidHandler: function (event, validator) { //display error alert on form submit
errorHandler.show();
}
});
};
return {
//main function to initiate template pages
init: function () {
runSetDefaultValidation();
runLoginValidator();
}
};
}();
编辑:修复标题
PhantomJS 日志文件输出,根据请求:
PhantomJS is launching GhostDriver...
[INFO - 2015-01-27T16:58:04.367Z] GhostDriver - Main - running on port 48152
[INFO - 2015-01-27T16:58:05.366Z] Session [a9641420-a645-11e4-95fd-c78c9ec356b6] - page.settings - {"XSSAuditingEnabled":false,"javascriptCanCloseWindows":true,"javascriptCanOpenWindows":true,"javascriptEnabled":true,"loadImages":true,"localToRemoteUrlAccessEnabled":false,"userAgent":"Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0","webSecurityEnabled":true}
[INFO - 2015-01-27T16:58:05.366Z] Session [a9641420-a645-11e4-95fd-c78c9ec356b6] - page.customHeaders: - {}
[INFO - 2015-01-27T16:58:05.366Z] Session [a9641420-a645-11e4-95fd-c78c9ec356b6] - Session.negotiatedCapabilities - {"browserName":"phantomjs","version":"1.9.8","driverName":"ghostdriver","driverVersion":"1.1.0","platform":"linux-unknown-64bit","javascriptEnabled":true,"takesScreenshot":true,"handlesAlerts":false,"databaseEnabled":false,"locationContextEnabled":false,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"cssSelectorsEnabled":true,"webStorageEnabled":false,"rotatable":false,"acceptSslCerts":false,"nativeEvents":true,"proxy":{"proxyType":"direct"},"phantomjs.page.settings.userAgent":"Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0"}
[INFO - 2015-01-27T16:58:05.366Z] SessionManagerReqHand - _postNewSessionCommand - New Session Created: a9641420-a645-11e4-95fd-c78c9ec356b6
[ERROR - 2015-01-27T16:59:08.083Z] WebElementLocator - _handleLocateCommand - Element(s) NOT Found: GAVE UP. Search Stop Time: 1422377948079
最后的ERROR
不是我问题的一部分,而更像是这里的书挡。当抓取算法查找应该在登录后显示的页面上的链接时,就会发生这种情况。由于我们没有成功提交登录表单,因此该链接自然不存在。
我不确定我的哪些更改导致了突破,但我可以说我添加了以下代码。 编辑:其中只有两个是新的。 删除了一个。
webdriver.DesiredCapabilities.PHANTOMJS["phantomjs.page.settings.localToRemoteUrlAccessEnabled"] = True
webdriver.DesiredCapabilities.PHANTOMJS["phantomjs.page.settings.browserConnectionEnabled"] = True
我提交了表单本身,而不是单击按钮(在更改上述配置之前,我以前也尝试过)。
formEl = self.find_element_by_css_selector("form[name='login']")
formEl.submit()
- AngularJS通过指令重新验证提交
- 验证提交表单上的电话格式
- JS表单验证 - 提交按钮不执行任何操作
- 如何将第二个函数绑定到 jQuery 验证提交处理程序
- 提交表单并绕过 jQuery 验证提交处理程序
- JavaScript错误表单验证:提交时清除所有输入字段
- jQuery 验证插件:相同的表单,不同的验证提交处理程序
- 未使用 MVC 4.5 不显眼的验证提交实时数据
- 验证提交到数据库的答案
- j查询选项卡/验证提交多个表单
- Javascript表单验证提交函数
- 简单的javascript表单验证提交不起作用
- 表单没有通过jQuery验证提交
- 使用javascript验证提交的表单
- jQuery验证提交空CkEditor
- 验证&提交表单,重置表单+更改一些CSS样式
- jQuery验证提交表单两次
- Javascript表单验证提交不起作用
- 使用ajax验证提交和保存表单-重要
- 表单验证提交,在提交姓名和城市的输出中首字母大写