使用 Selenium 从输入元素(类型=提交)获取文本

Posted

技术标签:

【中文标题】使用 Selenium 从输入元素(类型=提交)获取文本【英文标题】:Getting text from input element (type=submit) using Selenium 【发布时间】:2021-12-20 02:51:57 【问题描述】:

我正在尝试一些网络测试自动化。 为了练习我带了Sause demo site 它在页面上定义为登录按钮<input type="submit" class="submit-button btn_action" data-test="login-button" id="login-button" name="login-button" value="Login"> 它在屏幕上的文本是“LOGIN”(大写)。 我想从登录按钮获取文本。 首先我尝试使用login_button.text,它返回空字符串。好的,很清楚为什么和预期。 然后我尝试获取 login_button 的属性值,它返回“登录”字符串。 我检查了登录按钮是否应用了以下 CSS 样式并将文本变为大写。

.submit-button 
    text-transform: uppercase;

但是有没有可能从这个按钮获取文本的确切显示方式(“LOGIN”而不是“Login”)?

我使用的代码示例:

driver = webdriver.Chrome(CHROME_DRIVER_PATH)
driver.get("https://www.saucedemo.com/")
login_button = driver.find_element_by_id("login-button")
print(login_button.text)  # returns empty string
print(login_button.get_property("value"))  # returns "Login"
driver.quit()

【问题讨论】:

我猜想一些 html 内置函数,如 text-transformjs 正在用于将 Login 显示为 LOGIN,但我们无法获得您想要的文本。你需要使用python函数来隐藏它。 【参考方案1】:

Selenium 读取HTML DOM,但不是屏幕上准确显示的内容。

LOGIN按钮实际上有一个值属性设置为Login

要提取 value 属性的值,您可以使用以下任一Locator Strategies:

使用CSS_SELECTOR

print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input#login-button"))).get_attribute("value"))

使用XPATH

print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//input[@id='login-button']"))).get_attribute("value"))

控制台输出:

Login

注意:您必须添加以下导入:

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

正如您正确指出的那样,值 Login 应用以下 CSS 样式:

text-transform: uppercase;

将其以大写形式显示为LOGIN

【讨论】:

它对 OP 有什么帮助?他已经能够得到Login。你的答案基本上是 OP 问题。 另外,你为什么使用 CSS 或 XPATH ? OP 实际上有一个比你展示的更好的定位器。 @cruisepandey 回答你的问题:1)它有什么帮助:OP需要使用get_attribute() 2)你为什么使用CSS或XPATH:在过去的 3 到 4 年里,您一次又一次地问同样的问题,但有一次您尝试自己寻找答案吗?您是否有机会在 SO 上查看类似的问题?否则,请随时提出新问题,SO 贡献者将很乐意为您提供帮助。 1) get_property("value") 也可以完成这项工作。 2)您是否尝试自己找到答案? - 是的,我知道答案。我也是 SO 中 selenium 标签的核心贡献者之一。但是让我再澄清一次,ID 比 Selenium 自动化中的任何定位器都具有更高的优先级,但它必须是静态且唯一的,如果是,那么构建 CSS 或 XPATH 就没有意义了。希望这能帮助您了解其中的区别。 无论您是否是SO 中 selenium 标签的核心贡献者之一,但归根结底,我们作为一个社区必须做出贡献为了更大的事业。现在,最后一次让我回答你的问题。您可以使用 IDCLASSNAME 编写定位器,但 selenium 库(python)/jars(java)中的解析器始终会将它们转换为 CSS i> 在执行那行代码之前。 Check out this detailed discussion.【参考方案2】:

直接的答案是Selenium 向an HTTP 请求DOM,它可以update/retrieve info from DOM.

在您的情况下,正如您所强调的那样,它是一个 CSS 属性(文本转换)正在进行此更改。

你可以阅读这个属性,根据信息你可以使 Python upper()lower()

我建议从CSS property 进行验证并使用

driver.get("https://www.saucedemo.com/")

login_button = driver.find_element_by_id("login-button")
actual_login_button_text = login_button.get_attribute('value')
print('Actual text', actual_login_button_text)
text_type = login_button.value_of_css_property('text-transform')
print('CSS text type', text_type)

change_text = ''
if text_type == 'uppercase':
    change_text = actual_login_button_text.upper()
if text_type == 'lowercase':
    change_text = actual_login_button_text.lower()


print('Modified text', change_text)

输出:

Actual text Login
CSS text type uppercase
Modified text LOGIN

【讨论】:

谢谢。然后为了正确的工作需要实现文本转换属性的所有值(我希望有更简单的方法来获取显示的文本。

以上是关于使用 Selenium 从输入元素(类型=提交)获取文本的主要内容,如果未能解决你的问题,请参考以下文章

selenium测试(Java)--元素操作

Selenium-几种操作

如何使用 Jquery 在表上附加输入类型提交元素并绑定它?

selenium+python之元素定位方式介绍

Selenium 元素常用操作方法(键盘和鼠标事件)

selenium判断元素类型