【问题标题】:click action is not working in selenium点击操作在硒中不起作用
【发布时间】:2016-10-18 22:53:30
【问题描述】:

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

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

  1. 在文本输入框中输入数字
  2. 点击应用按钮
  3. 然后将触发 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


【解决方案1】:

仅仅因为按钮是可见的并且 selenium 认为它是可点击的并不意味着它可以使用。检查浏览器检查器并调查它是否与某些异步 javascript 相关联。这意味着,警报可能正在等待某个后台进程完成,然后您才能实际单击它以发生事件。

在输入字段中输入值时,可能会有一个异步脚本输出到服务器,并导致单击“应用”按钮时什么都不做,直到服务器响应。而这 500 毫秒的延迟刚好够 ajax 通信完成。

要了解有关 ajax 的更多信息:https://www.tutorialspoint.com/ajax/what_is_ajax.htm

【讨论】:

  • 感谢回复,我会看看你提供的资源
【解决方案2】:

我可能会尝试使用 js.ExecuteScript 方法(以下代码用于 c#)

IJavaScriptExecutor js = driver as IJavaScriptExecutor;
string jsOutput = (string)js.ExecuteScript(String.Format("document.getElementById('{0}').click();", elementId));

普通click 失败的地方

【讨论】:

  • 这就是 Selenium 的等待功能的用途。轮子可以帮助您找到地方,而不是重新发明。
【解决方案3】:

首先,我忘了提到这个网络应用程序是建立在 GWT(谷歌网络工具包)之上的。我已经确定驱动在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 处理程序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2010-12-28
    • 2020-12-09
    • 2019-10-13
    相关资源
    最近更新 更多