使用 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-transform
或 js
正在用于将 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 标签的核心贡献者之一,但归根结底,我们作为一个社区必须做出贡献为了更大的事业。现在,最后一次让我回答你的问题。您可以使用 ID 或 CLASSNAME 编写定位器,但 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 从输入元素(类型=提交)获取文本的主要内容,如果未能解决你的问题,请参考以下文章