首页 > 解决方案 > 我需要帮助确定与 Selenium 一起使用的 Web 表单字段

问题描述

为了更多地了解 Python、Selenium、Beautifulsoup 和一般的网页抓取,我开始了一个小型个人项目,该项目最终应该能够打开网页的主屏幕,导航到搜索字段,然后输入和搜索特定帐户数字。

目前我已经成功地使用 Selenium 打开网站主页,然后导航到包含我需要填写的表单的页面。我通过使用 Chromes 开发工具复制我需要单击的区域的 xpath,然后将其输入到 Selenium 的“查找元素”和“单击”功能中来做到这一点。

我遇到的问题是,当我尝试点击的特定字段的 xpath 输入到我的代码中时,会吐出以下错误

Traceback (most recent call last):
  File "C:/Users/WFrazierIII/PycharmProjects/Selenium Prcatice/Selenium Practice File.py", line 24, in <module>
    driver.find_element_by_xpath('/html/body/form/table/tbody/tr[2]/td[2]/input').click()
  File "C:\Users\WFrazierIII\PycharmProjects\Selenium Prcatice\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:\Users\WFrazierIII\PycharmProjects\Selenium Prcatice\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
    'value': value})['value']
  File "C:\Users\WFrazierIII\PycharmProjects\Selenium Prcatice\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\WFrazierIII\PycharmProjects\Selenium Prcatice\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/form/table/tbody/tr[2]/td[2]/input"}
  (Session info: chrome=83.0.4103.97)


Process finished with exit code 1

我的问题是,我应该努力为这个字段找到合适的 xpath,还是应该尝试使用不同的“find_element”来更好地让我的代码工作。

如果有帮助,我尝试单击的字段是本网站上的“帐户”字段:https ://www.alabamagis.com/Tallapoosa/frameset.cfm?cfid=3986761&cftoken=54089502

到目前为止,这是我当前的代码:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located

driver = webdriver.Chrome('C:\WebDriver\chromedriver.exe')

driver.get('https://www.alabamagis.com/Tallapoosa/')
driver.find_element_by_xpath('/html/body/center/font[2]/a').click()

time.sleep(6)

driver.find_element_by_xpath('/html/body/font/a[1]').click()

time.sleep(6)

driver.find_element_by_xpath('/html/body/form/table/tbody/tr[2]/td[2]/input').click()

最后,我将补充一点,我对 Python 或 Selenium 知之甚少,对 HTML 几乎一无所知(因此是蹩脚的入门项目),所以如果你认为有更好的方法来解决这个问题,那么我会喜欢这个指导。

感谢!

标签: pythonseleniumxpathcss-selectorsframe

解决方案


您面临的问题是您要访问的表单位于 iFrame 中。您必须明确告诉 selenium 切换到 iFrame。你可以这样做。

driver = webdriver.Chrome('./chromedriver')

driver.get('https://www.alabamagis.com/Tallapoosa/')
driver.find_element_by_xpath('/html/body/center/font[2]/a').click()

time.sleep(6)

driver.find_element_by_xpath('/html/body/font/a[1]').click()

time.sleep(6)

# new code starts here
driver.switch_to.frame('searchFrame')
driver.find_element_by_name('Master__Account').send_keys('your desired input')

此外,查找所需输入的更简单方法是使用find_element_by_name. 如果您检查您尝试抓取的网站的 HTML 代码,则input field您要访问的name属性具有 value Master__Account。您可以使用它来访问输入。


推荐阅读