WebDriver API:“由于无法聚焦元素而无法发送密钥”——比使用 Firefox 而不是 Chrome 更好的解决方法?

软件测试 自动化测试 硒网络驱动程序 硒2 错误报告 api测试
2022-01-11 14:20:43

Selenium 的 WebDriver API 的 chromedriver.exe Chrome 驱动程序中有一个错误。您不能将 send_keys 用于某些类型的输入,例如 jQuery 插件“ EZPZ Hint”。它适用于简单的表格。

现在,我将使用 Firefox 和 IE 而不是 Chrome 来进行测试,但我希望看到这个问题得到解决。有谁知道允许我使用 Chrome 而不是切换浏览器的不同解决方法?

这里的输入必须使用图像,因为它是动态生成的,我无法从 Chrome 的检查器中复制/粘贴。

我正在使用 Chrome 最新稳定版(14.0.835.202)和一个带有 unittest 类和鼻子作为测试运行器的 Python 脚本。

这是调试信息:

> Traceback (most recent call last):   File
> "\\server\QA\Automation\COMMON\product\common.py", line 35, in setUp
>     self.web.find_element_by_name("ezpz_hint_dummy_input").send_keys(self.user)
> File
> "C:\Python27\lib\site-packages\selenium-2.8.1-py2.7.egg\selenium\webdriver\remote\webelement.
> py", line 146, in send_keys
>     self._execute(Command.SEND_KEYS_TO_ELEMENT, {'value': typing})   File
> "C:\Python27\lib\site-packages\selenium-2.8.1-py2.7.egg\selenium\webdriver\remote\webelement.
> py", line 194, in _execute
>     return self._parent.execute(command, params)   File "C:\Python27\lib\site-packages\selenium-2.8.1-py2.7.egg\selenium\webdriver\remote\webdriver.p
> y", line 144, in execute
>     self.error_handler.check_response(response)   File "C:\Python27\lib\site-packages\selenium-2.8.1-py2.7.egg\selenium\webdriver\remote\errorhandle
> r.py", line 118, in check_response
>     raise exception_class(message, screen, stacktrace) WebDriverException: Message: 'Message: u\'focusElement execution
> failed;\\n Failed to send keys beca use cannot focus element\'
> \n-------------------- >> begin captured logging <<
> --------------------\ nselenium.webdriver.remote.remote_connection: DEBUG: POST http://127.0.0.1:51178/session {"sessionId ": null,
> "desiredCapabilities": {"platform": "ANY", "browserName": "chrome",
> "version": "", "javascr iptEnabled":
> true}}\nselenium.webdriver.remote.remote_connection: DEBUG: POST
> http://127.0.0.1:51178 /session/c85bcae35e0f07e805ea80c47ed9b75d/url
> {"url": "http://10.0.20.61/product", "sessionId": "c85bc
> ae35e0f07e805ea80c47ed9b75d"}\nselenium.webdriver.remote.remote_connection:
> DEBUG: POST http://127.0
> .0.1:51178/session/c85bcae35e0f07e805ea80c47ed9b75d/element {"using":
> "name", "sessionId": "c85bcae3 5e0f07e805ea80c47ed9b75d", "value":
> "ezpz_hint_dummy_input"}\nselenium.webdriver.remote.remote_conne
> ction: DEBUG: POST
> http://127.0.0.1:51178/session/c85bcae35e0f07e805ea80c47ed9b75d/element/:wdc:1319 220710066/value {"sessionId": "c85bcae35e0f07e805ea80c47ed9b75d",
> "id": ":wdc:1319220710066", "value ": ["send keys stuff here,
> redacted"]}\n--------------------- >> end captured logging <<
4个回答

错误消息显然听起来像 send_keys 失败,因为由于某种原因,它无法在将实际键发送到控件之前将焦点设置到输入控件。一种可能的解决方法是先单击输入,因为这可能会将焦点设置到输入控件。然后调用 send_keys 之后可以成功。

我会尝试几件事。

  • 获取不同版本的 Selenium。我正在使用 Selenium Webdriver 2.9,并且无法在我正在使用 chrome 驱动程序测试的网站上重现该问题。
  • 使用Javascript直接设置元素的文本:

    WebElement element = ...;
    String script = "arguments[0].setAttribute('value', 'Set to this text.');"
    ((JavascriptExecutor) driver).executeScript(script, element);
    

可能会建议不要直接使用 javascript,因为这将 a) 不能确保元素首先可见且处于活动状态 b) 不会触发元素上的任何事件,这有时是继续与您的页面交互所必需的。如果它不是必需的,那么它应该没关系。不幸的是,如果您需要触发诸如 onkeydown、onkeyup、onchange 等事件,我还没有找到使用 Selenium Webdriver 执行此操作的简单方法。

在这种情况下,发送键不起作用,因为焦点事件不起作用。因此,首先我们可以使用 executeScript 来获得元素上的焦点。一旦焦点在那里,就可以使用 webdriver api 提供的 send-keys 方法。

因此,要专注于输入,您可以执行以下操作:

JavascriptExecutor js;
js.executeScript ("document.getElementById('x').focus()");

一旦你将此行添加到你的 webdriver 代码(焦点将出现在元素上),那么你只需要使用 send_keys。

这是解决发送密钥的问题(对于 IE 11 问题)

   IWebElement name= Driver.FindElement(By.Id("name"));
   executor.ExecuteScript("arguments[0].click();", name);
   name.SetAttribute("value","Text name");