我还是Selenium测试世界的新手,我目前正在使用selenium chrome webdriver进行测试。
我想要做的是在下面的弹出对话框中:
/*
....
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按钮应该触发的服务器进行调用。
我不知道为什么会发生这种情况,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的click操作与GWT处理onclick函数的方式不同。如果您遇到同样的问题,请尝试使用sendKeys并为客户端添加onKeyPress的处理程序
答案 0 :(得分:1)
仅仅因为按钮是可见的并且selenium认为它是可点击的并不意味着它可以使用。检查浏览器检查器并调查它是否与某些异步javascript绑定。意思是,警报可能正在等待某些后台进程完成,然后才能实际单击它以使事件发生。
在输入字段中输入值时,可能会有异步脚本发送到服务器,并导致“应用”按钮在单击时不执行任何操作,直到服务器发出响应为止。那500ms的延迟足以让ajax通信完成。
要详细了解ajax:https://www.tutorialspoint.com/ajax/what_is_ajax.htm
答案 1 :(得分:0)
我可能会尝试使用js.ExecuteScript方法(下面代码是c#)
IJavaScriptExecutor js = driver as IJavaScriptExecutor;
string jsOutput = (string)js.ExecuteScript(String.Format("document.getElementById('{0}').click();", elementId));
正常click
失败
答案 2 :(得分:0)
首先,我忘了提到Web应用程序是基于GWT(Google Web工具包)构建的。我已经确定驱动程序在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的处理程序