Python 上的 Selenium - 提交方法似乎无法正确发送请求?
Posted
技术标签:
【中文标题】Python 上的 Selenium - 提交方法似乎无法正确发送请求?【英文标题】:Selenium on Python - Submit Method Doesn't Seem to Send Request Correctly? 【发布时间】:2020-10-13 23:08:05 【问题描述】:我在 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 等的了解还远远不够,无法弄清楚这一点。谁能给点建议?
【问题讨论】:
【参考方案1】:你已经够近了。在将新的 观察时间 设置为 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
浏览器快照:
【讨论】:
不幸的是,这给了我相同的结果;使用wait
命令确实有助于使其作为脚本流动而没有问题,但最终的点击命令只会导致网页静默。 driver.find_element_by_css_selector("input[name='check_time']").click()
... 似乎确实有效,因为 Selenium 没有给我任何错误,也没有说它找不到元素。我开始认为在进一步研究之前尝试使用 Chrome 或 Firefox 可能是一个不错的选择!【参考方案2】:
感谢@DebanjanB 提供的全面代码,改进了我所有的方法;但是,通过切换到 Firefox,我发现他的代码和我的代码一切正常。
显然是 Safari 的网络驱动程序中的一些异常导致了该问题。
【讨论】:
@DebanjanB 的代码块应该可以跨浏览器和跨平台工作:)以上是关于Python 上的 Selenium - 提交方法似乎无法正确发送请求?的主要内容,如果未能解决你的问题,请参考以下文章
Web应用程序上的Python Selenium click()方法