【发布时间】:2018-01-08 20:16:33
【问题描述】:
我正在测试一个网站的登录功能,尽管我可以正确找到登录按钮,.click() 似乎并没有按我预期的方式工作。
一、相关测试js代码:
driver.sleep(1000)
driver.findElement(By.name('email')).sendKeys(fakeEmail);
driver.findElement(By.name('password')).sendKeys(fakePassword);
driver.sleep(5000);
driver.findElement(By.xpath("//button[@type='submit']")).isEnabled()
.then(function(isEnabled) {
console.log(isEnabled) // prints true
var el = driver.findElement(By.name('password'));
el.sendKeys(webdriver.Key.ENTER); //method 1
})
//note: these xpaths are correct. I am able to get inner text, for example
driver.findElement(By.xpath("//button[@type='submit']")).sendKeys(webdriver.Key.ENTER); //method 2
driver.findElement(By.xpath("//button[@type='submit']")).click(); //method 3
接下来,这里是登录按钮html中的代码:
<button type="submit" ng-disabled="attempt_Error" ng-class="{'disabled': (!(usr.email &amp;&amp; usr.password) || attempt_Error)}" ng-if="!reset_Hash &amp;&amp; !forgotMode" class="btn btn-prim ng-scope" style=""> Log in</button>
预期行为(手动工作):
- 鼠标悬停时,按钮变为 color1。
- 点击后,按钮变为 color2。
- 假设电子邮件和密码正确,发布后转到主页。
我在执行时看到的:
- 按钮变为 color2。
- 什么都没有发生。
- 窗口保持打开状态,但如果我尝试手动单击按钮,则没有任何反应。
我在我的 js 代码中标记了方法 1-3,但它们都没有给出预期的行为。我已经分别和结合尝试过它们。我已经尝试过这样做后只是尝试进入主页,但我确实没有登录。
我的问题是:为什么element.click() 不按我希望的方式行事?
编辑:我知道正在调用 login(form),因为我有一个控制台日志。不过,这里有一些有趣的事情:控制台中出现“加载资源失败:服务器响应状态为 403(禁止)”错误!如果之后我继续单击该按钮,我会得到angular.js:8632 POST http://localhost:9000/api/session 403 (Forbidden)。如果我手动执行此操作,则该错误不存在!知道为什么吗?
版本:
"chai": "^4.1.0",
"chai-as-promised": "^7.1.1",
"chromedriver": "^2.31.0",
"mocha": "^3.4.2",
"selenium-webdriver": "^3.5.0",
【问题讨论】:
-
您同时使用 sendKeys 并单击同一元素? driver.findElement(By.xpath("//button[@type='submit']")).sendKeys(webdriver.Key.ENTER); driver.findElement(By.xpath("//button[@type='submit']")).click();
-
我都试过了,都没有成功。我读到
sendKeys(ENTER)也可以用来模拟点击。但是,是的,这些方法都不起作用,我分别尝试了它们。 -
你能发布正在测试的页面的html吗?听起来您已成功找到该元素,然后单击它,如果它更改为 color2。你只是没有被重定向?
-
不仅我没有被重定向,登录功能甚至都没有发生。如果它确实让我登录,那么即使我没有被重定向,只需刷新页面就会将我带到主屏幕。这是周围的表格html:
<form name="form" ng-submit="forgotMode?forgotPass(form):(resetHash?resetPass(form):login(form))" novalidate="novalidate" autocomplete="off" class="ng-valid ng-dirty"> -
当您手动输入密码并立即按回车键登录时,文本光标仍在表单中会发生什么?
标签: javascript unit-testing selenium selenium-webdriver automated-tests