我需要帮助来识别与Selenium一起使用的web表单字段

2024-05-13 17:08:32 发布

您现在位置:Python中文网/ 问答频道 /正文

为了进一步了解Python、Selenium、Beautifulsoup和webscraping,我开始了一个小型的个人项目,最终应该能够打开网页的主屏幕,导航到搜索字段,并输入和搜索特定的帐号

目前,我已经成功地使用Selenium打开站点主页,然后导航到包含我需要填写的表单的页面。我通过使用Chromes developer工具复制我需要点击的区域的xpath,然后将其输入Selenium的“find element”和“click”函数来实现这一点

我遇到的问题是,当输入到代码中时,我试图点击的特定字段的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_元素”来更好地让代码工作

如果有帮助,我尝试单击的字段是此网站上的“帐户”字段: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几乎一无所知(因此是lame starter项目),因此如果您认为有更好的方法来实现这一点,那么我会喜欢指南

谢谢!


Tags: importbydriverseleniumelementfindusersxpath
3条回答

您没有将帐号发送到文本字段,请尝试此操作 driver.find_element_by_xpath('/html/body/form/table/tbody/tr[2]/td[2]/input').send_keys('account_no')

send_键用于将输入发送到textfield 及

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

点击搜索按钮

帐户字段位于<frame>内,因此您必须:

  • 诱导WebDriverWait使所需的帧可用,并切换到它
  • 诱导WebDriverWait,使所需的元素可单击
  • 您可以使用以下任一Locator Strategies

    • 使用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 WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      
  • 浏览器快照:

Tallapooosa


参考文献

您可以在以下内容中找到一些相关讨论:

您面临的问题是,要访问的表单驻留在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具有值为Master__Accountname属性。您可以使用它来访问输入

相关问题 更多 >