点击动作在selenium中不起作用

时间:2016-10-18 22:53:30

标签: selenium selenium-webdriver selenium-chromedriver

我还是Selenium测试世界的新手,我目前正在使用selenium chrome webdriver进行测试。

我想要做的是在下面的弹出对话框中:

  1. 在文本输入框中输入数字
  2. 点击“应用”按钮
  3. 然后将触发Web应用程序将信息发布到服务器端。
  4. 我的代码:

    /*
     ....
     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的处理程序

3 个答案:

答案 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的处理程序