Python和Selenium无法在日期选择器中选取日期。

3

我很新于Python,并且正在学习如何使用Selenium爬取数据。

当我尝试从monmondo.com(以此为例)的日期选择器表单中选择日期时,遇到了问题。

这是我最远能到达的地方:(编辑:我比以前做得更好了一点,但仍然卡住了)

from selenium import webdriver
browser = webdriver.Firefox()

browser.get("https://www.momondo.com")
browser.implicitly_wait(5)
date = browser.find_element_by_name("ctl00$Content$ctl04$SearchFormv8$SearchFormFlight$InputDepart").click()
browser.implicitly_wait(5)
test= browser.find_elements_by_xpath("//*['ui-datepicker-div']//td[@data-year='2017'][@data-month='2']/a[@class='ui-state-default'][@href='#'][text()='20']")
test[0].click()

这会导致
selenium.common.exceptions.ElementNotVisibleException: Message: 

我已经使用FirePath测试了XPath,似乎它能正确地在页面源代码中找到。

日历页面在源代码中的结构如下:

<td class=" " data-handler="selectDay" data-event="click" data-month="2" data-year="2017"><a class="ui-state-default" href="#">20</a></td>

    <a class="ui-state-default" href="#">20</a>

我的猜测是,数据-甚至点击触发了选择,但它似乎位于我可以找到数字的类别之上。话虽如此,我不确定是否是这种情况。
作为新手,我非常感谢您的帮助!
谢谢!

ElementNotVisibleException,嗯,该元素不可见。您能在浏览器中看到该元素吗? - Usmiech
说起来很简单!该代码点击打开日历,但遗憾的是没有任何反应。 可能与弹出窗口有关吗? 非常感谢您的回答。 - François T
那么选择器在一个弹出窗口中?如果不是,并且您无法在Selenium中单击它,则可以使用来自jQuery的东西,例如$(“css_selector”).click() Selenium可以执行JS。这应该不会引发错误,但请确保检查浏览器中的开发人员控制台。顺便说一下,monmondo.com显示了一些日本托管网站。 - Usmiech
检查 https://dev59.com/pGMm5IYBdhLWcg3wX98W,寻找类似于“selenium popup window python”的内容。 - Usmiech
好的,你可以通过browser.execute_script("somejs")执行任何JS。 - Usmiech
显示剩余2条评论
1个回答

3

尝试添加一些等待时间,直到元素变为可见:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Firefox()  
browser.get("https://www.momondo.com")
browser.implicitly_wait(5)
# Click to open drop-down
date = browser.find_element_by_xpath("//div[@class='input _date-depart']/div[@class='ui-calendar']/input").click()
# Choose depart date
wait(browser, 10).until(EC.visibility_of_element_located((By.XPATH, "//td[@data-handler='selectDay']/a[text()='20']"))).click()
# Choose return date
wait(browser, 10).until(EC.visibility_of_element_located((By.XPATH, "//td[@data-handler='selectDay']/a[text()='30']"))).click()

非常感谢这段代码! 起初我运行它时,它会等待超时才打开弹出窗口,所以为了双重确认,我在另一台电脑上运行了它,结果奇迹般地成功了! 我认为这与我在第一次运行Selenium时意外丢弃的消息有关,问题是我不知道该如何纠正它,但这是另一个故事了。 - François T
1
欢迎。如果我的回答帮助您解决了当前的问题,请将其标记为“已接受”。谢谢。 - Andersson
搞定了,再次感谢! 如果我用Firefox找到解决方案,我会发布的,目前为止我已删除了Geckodriver和pref文件,但还是没有起作用。 我会尝试彻底清除它。 - François T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接