【问题标题】:How can I use Selenium to navigate a pop-up calendar with Python?如何使用 Selenium 在 Python 中导航弹出式日历?
【发布时间】:2015-05-27 18:12:40
【问题描述】:

这是一个爱好项目,所以我可以更熟悉 Selenium。

我有一个日期列表。我想获取每个日期的电影时间。我可以毫无问题地加载剧院网站和日历,但是当我选择特定的日期时,我被卡住了。如何使用 Selenium 单击日历中的日期?

这是我目前所拥有的。打开浏览器,加载页面,点击打开日历:

from selenium import webdriver

browser = webdriver.Firefox()
url = "https://www.amctheatres.com/movie-theatres/los-angeles/amc-promenade-16"
browser.get(url)
browser.find_element_by_xpath(".//*[@id='showtime-date']").click()
browser.implicitly_wait(3)

到目前为止,我的三个尝试都没有奏效。

尝试 1: 当我尝试通过文本查找链接时,我得到:

NoSuchElementException:消息:无法定位元素

elem = browser.find_element_by_link_text('28').click()                                                   

尝试 2:
这个 xpath 找到元素并且点击方法有效,但我希望能够通过字符串文本选择一天

xpath = ".//*[@id='theatre-showtimes-202']/div/div[2]/div[1]/div/div/div[1]/table/tbody/tr[5]/td[5]"     
elem = browser.find_element_by_xpath(xpath).click()                                                      

尝试 3:
通过 xpath 和 text 找到元素可以工作,但是 click 方法没有做任何事情

xpath_by_text = '//td[contains(text(), "28")]'
elem = browser.find_element_by_xpath(xpath_by_text).click()

如何按天数找到日历日然后点击?

【问题讨论】:

  • 您可以使用绝对 xpath 而不是相对路径。

标签: python python-3.x selenium selenium-webdriver


【解决方案1】:

尝试1:当我尝试通过文本查找链接时

这不起作用,因为“通过链接文本”定位器仅搜索 a 元素。你需要一个td 元素。

尝试 2 ...

正如您已经指出的,这不是您想要做的。您需要通过文本定位元素。

尝试 3

这非常接近预期的结果,但是,如您所见,有两个带有28 文本的元素。您正在找到第一个td(因为根据WebDriver specification“所有元素定位策略必须按照它们在当前文档中出现的顺序返回元素”),它被禁用(这解释了为什么点击什么都不做)并且来自上个月。

相反,通过文本定位 td 元素,此外,跳过类属性值中包含 disabled 的元素:

//td[. = "28" and not(contains(@class, "disabled"))]

来自 Chrome 控制台的演示:

> $x('//td[. = "28"]')
[<td class=​"old disabled day">​28​</td>​, <td class=​"day">​28​</td>​]

> $x('//td[. = "28" and not(contains(@class, "disabled"))]')
[<td class=​"day">​28​</td>​]

【讨论】:

  • 啊,我明白了。感谢您的解释。
【解决方案2】:

你可以试试这个解决方案

WebDriver driver = new FirefoxDriver();
driver.get("https://www.amctheatres.com/movie-theatres/los-angeles/amc-promenade-16");
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);

driver.findElement(By.xpath("html/body/div[3]/div[2]/div[1]/div/div/div/div[2]/div[1]/div/input [1]")).click(); driver.findElement(By.xpath("html/body/div[3]/div[2]/div[1]/div/div/div/div[2]/div[1]/div/div/div[ 1]/table/tbody/tr[5]/td[5]")).click();

【讨论】:

  • 这个问题是python特有的。
  • 答案对 java 来说是完美的,但对 python 来说却不是。但是python用户可以从这个概念中得到帮助
  • @RiponAlWasim 好吧,即使这是 java,答案也远非完美:首先,隐式等待通常不可靠,并且会使您的测试变慢。此外,您不需要多次操作隐式等待 - 它只是指示 webdriver 在尝试查找元素之前等待多长时间 - 通常在开始时调用一次。另外,答案中使用的 XPath 表达式非常脆弱和复杂,因为它们依赖于页面的完整 HTML 结构。我可以继续:)
  • @alecxe 如果你能分享我如何使这个脚本更完美,我将不胜感激
  • @alecxe:您说得对,不建议使用复杂且绝对的 xpath。但在极少数情况下,它需要使用绝对 xpath,因为相对 xpath 不起作用。我猜,这是其中一种情况。
猜你喜欢
  • 2011-09-15
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2015-06-13
  • 2011-01-15
相关资源
最近更新 更多