如何在 Selenium 和 Python 中使用类型查找元素
Posted
技术标签:
【中文标题】如何在 Selenium 和 Python 中使用类型查找元素【英文标题】:How to find element using type in Selenium and Python 【发布时间】:2018-06-30 02:53:13 【问题描述】:我有下面的 html 代码。
<div align="center">
<input type="file" name="filePath"><br>
<input type="Submit" value="Upload File"><br>
</div>
我正在尝试使用 Selenium 和 Python 来查找“文件”和“提交”这两个元素。以下是我尝试使用的代码。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# create a new Firefox session
driver = webdriver.Chrome()
# Maximize the browser window
driver.maximize_window()
# Enter the url to load
driver.get("<<MY PAGE TO LOAD>>")
# Wait for the page to load
driver.implicitly_wait(5)
# find the upload file type and pass a test value
upload_field = driver.find_element_by_partial_link_text('file')
upload_field.clear()
upload_field.send_keys("test")
当我运行此代码时,我能够在 Chrome 浏览器中成功加载页面,但出现以下异常。
# Exception when trying to get element by type
Traceback (most recent call last):
File "C:\Users\TEST\Desktop\Test.py", line 33, in <module>
upload_field = driver.find_element_by_partial_link_text('file')
File "C:\Python\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 453, in find_element_by_partial_link_text
return self.find_element(by=By.PARTIAL_LINK_TEXT, value=link_text)
File "C:\Python\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 955, in find_element
'value': value)['value']
File "C:\Python\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 312, in execute
self.error_handler.check_response(response)
File "C:\Python\Python36\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 237, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: "method":"partial link text","selector":"file"
(Session info: chrome=63.0.3239.132)
(Driver info: chromedriver=2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73),platform=Windows NT 10.0.14393 x86_64)
我查看了here 提供的解决方案,但这也引发了错误。我目前正在使用 Python 3.6.4 x64 和 Selenium 3.8.1。我的操作系统是 Windows 7 x64 位。如何在 html 中获取带有 'type' 的元素?
【问题讨论】:
你为什么不尝试完整的 xpath(//input[@name='filePath']) ,而不是部分文本。 有点离题,但不要使用implicitly_wait
,而是使用explicit wait。它会更快、更可靠。
【参考方案1】:
在查找元素时结帐the docs。我发现 xpaths 或 css 选择器特别强大,因为它们非常通用。
xpath
upload_field = driver.find_element_by_xpath("//input[@type='file']")
css 选择器
upload_field = driver.find_element_by_css_selector("input[name='filePath'][type='file']")
【讨论】:
谢谢@Alex。我使用driver.find_element_by_xpath
方法来查找file
和Submit
这两个元素。它完美无缺。我还有一个后续查询。 file
元素需要传递一个文件。如果我希望用户选择他选择的文件而不是在代码中硬编码呢?
@Code_Sipra 这应该会弹出一个对话框,用户可以在其中选择文件...如果遇到问题,您可能想问一个新问题!
好吧,它似乎没有弹出对话框。但正如你所建议的,我可以使用“tkinter”让用户单独提供上传文件的路径。感谢您的投入和指导。这解决了我在 selenium 中读取元素的所有问题。
@Code_Sipra 很高兴听到这个消息!
抱歉,我还有一个问题。通常,要上传的文件会很大。 ~50-100mb 大小。上传文件后,系统不会显示任何“上传完成”消息。在单击提交按钮之前,如何确保整个文件已完全上传?我需要在 SO 中将此作为一个单独的问题提出吗?【参考方案2】:
find_element_by_partial_link_text
查找元素 text。此外,它仅适用于<a>
标签。例如,driver.find_element_by_partial_link_text('file')
将计算以下 html
<a type="file" name="filePath">file</a>
但不是你的 html,因为元素没有文本。
您可以改为通过 name
属性定位元素
driver.find_element_by_name('filePath')
【讨论】:
谢谢@Guy,这适用于元素file
。它不适用于元素Submit
。
@Code_Sipra 因为提交没有name
属性。您可以使用css_selector
定位到value
, driver.find_element_by_css_selector('[value="Upload File"]')
find_element_by_partial_link_text()
仅适用于链接(例如<a ...>...</a>
)!适当更新您的答案,以免混淆 OP
@Andersson 已编辑。【参考方案3】:
这不是在 selenium 中使用 partial text 的正确方法。 请通过链接了解如何使用部分链接https://www.softwaretestingmaterial.com/how-to-locate-element-by-link-text-and-partial-link-text-locator/
回答您的问题。 使用名称等其他属性来标识定位器。
否则试试这个定位器“//input[@name='filePath']”
【讨论】:
感谢@Pradeep hebbar 的输入。在这种情况下,我错误地使用了driver.find_element_by_partial_link_text
。感谢您分享如何正确使用它的链接。将来可能会对我有所帮助。以上是关于如何在 Selenium 和 Python 中使用类型查找元素的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Selenium 和 Python 在控制台中跳过调试日志
如何在 python 中使用 Selenium 和 Beautifulsoup 解析网站? [关闭]
如何使用 Selenium 和 Python 在元素中查找元素?
如何使用 Selenium 和 Python 在 Python 类中调用方法