python - Python 上的 Selenium - 提交方法似乎无法正确发送请求?
问题描述
我在 Python 脚本中使用 Selenium 来查询 NASA 的小体数据库以获取小行星的位置。我一直在使用 Python shell 来检查我的命令是否得到了我想要的结果,但是我在“提交”方法方面遇到了一个一致的问题。
我正在处理的页面是https://ssd.jpl.nasa.gov/sbwobs.cgi。我要做的就是让 Selenium 单击“观察时间”旁边的“更改”链接,在打开的页面上填写一个字段,然后单击生成的“使用指定时间”按钮。
我设置了一个名为“browser”的 Selenium WebDriver 对象,然后我发送的第一个命令是:
browser.find_element_by_css_selector("a[href*='time']").click()
哪个有效并将我发送到我的目标页面,即https://ssd.jpl.nasa.gov/sbwobs.cgi?s_time=1#top
然后我找到文本字段并填写:
browser.find_element_by_name('obs_time').send_keys("2021-04-01 01:00")
...我需要做的最后一件事是单击“使用指定时间”按钮接受这一点。我试过:
browser.find_element_by_name("check_time").click()
..但这没有回应。然后我尝试了:
browser.find_element_by_name("check_time").submit()
...这似乎有效,但在没有实际更改时间的情况下将我带回上一页。如果我手动单击该按钮,它将正常工作。
Selenium 肯定会找到正确的元素,并且该submit
方法正在做某事,但它可能没有正确发送文本框中的信息。
我对 HTML 等的了解还不够,无法弄清楚这一点。任何人都可以提供任何建议吗?
解决方案
你离得够近了。在设置新的观察时间之前,2021-04-01 01:00
您需要清除之前的输入。理想情况下,要更改观察时间,您必须诱导WebDriverWait并且element_to_be_clickable()
您可以使用以下任一Locator Strategies:
使用
CSS_SELECTOR
:driver.get('https://ssd.jpl.nasa.gov/sbwobs.cgi') WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a[href*='time']"))).click() element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='obs_time']"))) element.click() element.clear() element.send_keys("2021-04-01 01:00") driver.find_element_by_css_selector("input[name='check_time']").click()
使用
XPATH
:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[contains(@href, 'time')]"))).click() element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@name='obs_time']"))) element.click() element.clear() element.send_keys("2021-04-01 02:00") driver.find_element_by_xpath("//input[@name='check_time']").click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
浏览器快照:
推荐阅读
- flutter - 如何将我的提供商转变为服务?
- r - 闪亮的应用服务器不加载“* .rds”对象
- java - 两个独立服务中是否存在数据同步模式?
- c++ - 如何在 C++ 中正确实现 addObject() 函数?
- javascript - 记录来自 API 调用的函数结果 - Javascript
- reactjs - 您可以根据路由器位置动态更新 Firestore 查询吗?
- c - 为什么 fopen() 和 open() 不能识别 char 指针
- python - 带有 DeleteView 的 Bootbox 在 Django 中找不到 url
- python - 需要帮助打印清单
- mysql - docker-compose 与 Spring Boot 和 MySQL 集成不断发生错误通信链接失败