我需要帮助识别用于 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,还是应该尝试使用不同的&ldquo;find_element&rdquo;来更好地使我的代码工作。


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


谢谢!


白衣染霜花
浏览 323回答 3
3回答

翻过高山走不出你

您面临的问题是您要访问的表单驻留在 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 heredriver.switch_to.frame('searchFrame')driver.find_element_by_name('Master__Account').send_keys('your desired input')此外,查找所需输入的更简单方法是使用find_element_by_name. 如果您检查要抓取的网站的 HTML 代码,input field您要访问的网站的name属性值为Master__Account。您可以使用它来访问输入。

阿波罗的战车

Account字段在 a 中,<frame>因此您必须:诱导WebDriverWait以等待所需的框架可用并切换到它。诱导WebDriverWait使所需的元素可点击。您可以使用以下任一定位器策略:使用CSS_SELECTOR:driver.get('https://www.alabamagis.com/Tallapoosa/frameset.cfm?cfid=3986761&cftoken=54089502')WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"frame[name='searchFrame']")))WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='Master__Account']"))).send_keys("Sean Ken")使用XPATH:driver.get('https://www.alabamagis.com/Tallapoosa/frameset.cfm?cfid=3986761&cftoken=54089502')WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//frame[@name='searchFrame']")))WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[@name='Master__Account']"))).send_keys("Sean Ken")注意:您必须添加以下导入:from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as EC浏览器快照:

jeck猫

您没有将帐号发送到文本字段,试试这个&nbsp;driver.find_element_by_xpath('/html/body/form/table/tbody/tr[2]/td[2]/input').send_keys('account_no')send_keys 用于将输入发送到文本字段和driver.find_element_by_xpath('/html/body/form/table/tbody/tr[11]/td/input[1]').click()点击搜索按钮
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python