为了账号安全,请及时绑定邮箱和手机立即绑定

我需要帮助识别用于 Selenium 的 Web 表单字段

我需要帮助识别用于 Selenium 的 Web 表单字段

白衣染霜花 2023-01-04 14:19:46
为了学习更多关于 Python、Selenium、Beautifulsoup 和一般网络抓取的知识,我开始了一个小型个人项目,该项目最终应该能够打开网页的主屏幕、导航到搜索字段、输入和搜索特定帐户数字。目前,我已经成功地使用 Selenium 打开站点主页,然后导航到包含我需要填写的表单的页面。我通过使用 Chromes 开发人员工具复制我需要单击的区域的 xpath,然后将其输入 Selenium 的&ldquo;查找元素&rdquo;和&ldquo;单击&rdquo;功能来完成此操作。我遇到的问题是,当输入我的代码时,我尝试单击的特定字段的 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 几乎一无所知(因此是蹩脚的入门项目),所以如果你认为有更好的方法来解决这个问题,那么我会喜欢这个指导。谢谢!
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超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 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属性值为Master__Account。您可以使用它来访问输入。


查看完整回答
反对 回复 2023-01-04
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

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 WebDriverWait

from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions as EC

浏览器快照:

//img1.sycdn.imooc.com/63b51ab30001831913650765.jpg

查看完整回答
反对 回复 2023-01-04
?
jeck猫

TA贡献1909条经验 获得超7个赞

您没有将帐号发送到文本字段,试试这个 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()

点击搜索按钮


查看完整回答
反对 回复 2023-01-04
  • 3 回答
  • 0 关注
  • 322 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信