【问题标题】:Select the focused element in Selenium在 Selenium 中选择焦点元素
【发布时间】:2019-04-05 11:00:46
【问题描述】:

我在处理什么

在我的一个测试中,我需要与使用常规 css 选择器或 xpath 很难选择的弹出输入字段进行交互。不过,我知道这个弹出框会成为焦点。

我如何使用它的焦点来正确断言输入字段包含一些文本?

我正在寻找的伪代码:

element = driver.find_element_by_FIND_THE_ELEMENT_WITH_FOCUS
assert elem.text == "foobar"

我遇到的部分解决方案:

Possibly a working solution in Ruby:

element = @driver.find_element :css, 'input:focus'
sleep(3)

element.send_keys "Hello WebDriver!"
assert_equal(element.attribute('value'),"Hello WebDriver!")

Getting the focused element with jQuery:

var focus = $(document.activeElement);

请问您能否在 python 中提供解决方案?

编辑:

这是元素的 HTML:

<div class="css-1492t68">Select a speaker...</div>

我意识到我的问题可能会导致一些混乱,因为元素本身没有语义 <input> 标记,而是一个 <div>。我想这是由我们的开发团队在设计此应用时使用的 quill-editor 库处理的。

这是弹出框的截图:

【问题讨论】:

  • 你能提供一些html吗?
  • 但是你可以使用显式等待元素点击。
  • 你说this window will have focus ---这是否意味着文本字段位于不同的浏览器窗口(弹出窗口)中?
  • 不抱歉,我应该指定的。它在同一个窗口和选项卡中,只是一个弹出框(在问题中添加了屏幕截图)
  • 你能提供这个输入的 HTML 吗?

标签: python selenium


【解决方案1】:

由于元素没有一致的 CSS 类,使用 XPath 表达式可能是您最好的选择。

您需要通过匹配包含预期文本的<div> 并具有以css- 开头的CSS 类来等待元素可点击(这意味着难以处理)。这样做应该让 JavaScript 有足够的时间在浏览器中完成它的工作来初始化 quill-editor 并显示它:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ExpectedConditions

xpath = "//div[starts-with(@class, 'css-')][contains(., 'The text you expect to find')]"
expected_condition = ExpectedConditions.element_to_be_clickable((By.XPATH, xpath))
element = WebDriverWait(driver, 20).until(expected_condition)

如果此弹出字段直接位于特定父元素内,则可以相应地进一步限制 xpath 表达式。

如果成功,则不会抛出任何错误。如果它不成功,它应该抛出一个 WebDriverTimeoutException (或者在 Python 中调用这个错误)。

【讨论】:

  • 我不想在我的问题上过于宽泛,所以我省略了一些细节。我需要这样做的主要原因是因为我发现ActionChainssend_keys 方法相当不可靠。因此,在继续之前,我想检查该字段是否确实收到了所有键并且现在包含正确的文本。
  • 我想我可以将整个条件和WebDriverWait 放入一个循环中,一旦等待通过我就会退出它。
  • 我想知道 send_keys 方法是否由于竞争条件而显得不可靠。可能并非所有字符都出现在该字段中,因为在 Selenium 开始在该字段中输入之前,JavaScript 尚未在客户端完成执行。
【解决方案2】:

使用:

elem = driver.switch_to.active_element

【讨论】:

  • 感谢您的回答,但是,当我使用print(elem.text) 遵循给定行时,它什么也不输出
猜你喜欢
  • 2020-07-25
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多