首页 > 解决方案 > 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 等的了解还不够,无法弄清楚这一点。任何人都可以提供任何建议吗?

标签: pythonseleniumxpathcss-selectorswebdriverwait

解决方案


你离得够近了。在设置新的观察时间之前,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
    
  • 浏览器快照:

美国国家航空航天局


推荐阅读