如何在 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 方法来查找fileSubmit 这两个元素。它完美无缺。我还有一个后续查询。 file 元素需要传递一个文件。如果我希望用户选择他选择的文件而不是在代码中硬编码呢? @Code_Sipra 这应该会弹出一个对话框,用户可以在其中选择文件...如果遇到问题,您可能想问一个新问题! 好吧,它似乎没有弹出对话框。但正如你所建议的,我可以使用“tkinter”让用户单独提供上传文件的路径。感谢您的投入和指导。这解决了我在 selenium 中读取元素的所有问题。 @Code_Sipra 很高兴听到这个消息! 抱歉,我还有一个问题。通常,要上传的文件会很大。 ~50-100mb 大小。上传文件后,系统不会显示任何“上传完成”消息。在单击提交按钮之前,如何确保整个文件已完全上传?我需要在 SO 中将此作为一个单独的问题提出吗?【参考方案2】:

find_element_by_partial_link_text 查找元素 text。此外,它仅适用于&lt;a&gt; 标签。例如,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() 仅适用于链接(例如&lt;a ...&gt;...&lt;/a&gt;!适当更新您的答案,以免混淆 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 类中调用方法

如何在 Selenium 和 Python 中使用类型查找元素

如何在 Selenium 的无头 Firefox 中使用 --screenshot 和 python