【发布时间】:2016-10-18 22:53:30
【问题描述】:
我还是 Selenium 测试领域的新手,我目前正在使用 selenium chrome webdriver 进行测试。
我想要做的是在下面的弹出对话框中:
- 在文本输入框中输入数字
- 点击应用按钮
- 然后将触发 Web 应用程序将信息发布到服务器端。
我的代码:
/*
....
a bunch of assert and wait.until function to make sure everything is correct till this step.
....
*/
driver.findElement(By.xpath(DIALOGBOX + "/input")).sendKeys("10");
//Thread.sleep(500);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath(APPLY_BUTTON)));
new Actions(driver).moveToElement(driver.findElement(By.xpath(APPLY_BUTTON))).click().perform();
这是我到目前为止发现的,如果我取消注释 Thread.sleep(500),一切都会完美运行。但如果没有Thread.sleep(500),Web 应用程序将不会对应触发 Apply 按钮的服务器进行 post 调用。
我不知道为什么会发生这种情况,Thread.sleep(500) 对单击操作有什么影响,是 selenium 需要时间移动到元素并在鼠标尚未到达按钮位置时执行单击?以及如何在不使用线程睡眠的情况下修复我的案例?
更新及解决方案:
首先,我忘了提到 Web 应用程序是基于 GWT(Google web toolkit) 构建的。我已经确定驱动在click()之前已经成功获取到了button元素,所以bug最小化到action的click()。
然后我尝试了
new Actions(driver).moveToElement(driver.findElement(By.xpath(APPLY_BUTTON)).sendKeys(Keys.ENTER).perform();
完美运行,无需让线程休眠。 所以这个bug的原因是selenium的点击动作与GWT处理onclick函数的方式不同。如果您遇到同样的问题,请尝试使用 sendKeys 并为客户端添加 onKeyPress 处理程序
【问题讨论】:
-
一般的答案是使用Selenium的wait functionality。
-
@PaulHicks 感谢您的回复。你的意思是用wait来代替thread.sleep吗?
-
有点。 Thread.sleep 不合适。您应该等待应用按钮可点击。查看提到的答案、该页面上的其他答案参考以及waits in Selenium 了解更多信息。
-
@PaulHicks 感谢您的帮助,我实际上考虑了这个原因,并尝试在点击前添加等待可点击元素,但它仍然无法正常工作
-
我可能会尝试js.ExecuteScript方法
标签: selenium selenium-webdriver selenium-chromedriver