【问题标题】:Selenium click on Highcharts seriesSelenium 点击 Highcharts 系列
【发布时间】:2013-09-03 07:03:47
【问题描述】:

我正试图找到几年前在 Google Selenium 论坛上发布的this question 的解决方案(我发现的最相似的事情......不幸的是,论坛中没有发布答案)。在我的 Selenium 测试(Python 绑定)中,如何单击 Highcharts 数据系列来触发 onClick 事件?我正在尝试为条形图执行此操作,但任何示例都可以。手动这行得通。当我单击数据系列时,会弹出一个新的 div,其中包含有关该数据系列的其他信息,我想使用 Selenium 验证此操作。我可以使用 ActionChains 让系列工具提示出现,但由于某种原因,在 Selenium 中似乎没有触发 click() 事件。

我尝试点击“highcharts-series”类的元素、这些元素的子矩形以及整个父元素“highcharts-series-group”。我取得的最大进展是单击该系列的子矩形,因为我可以看到工具提示弹出(见屏幕截图)。但是没有点击动作——Selenium 超时等待下一步。

一个原因可能是因为 Highcharts 组容器 (highcharts-series-group) 的 zIndex 高于我要单击的元素(3 vs. 0.1)。但是单击整个组没有任何作用,在真正的浏览器中,我相信我单击的是实际系列,而不是组容器——所以我假设由于它在真正的浏览器中工作,zIndex 不应该影响我的点击?您可以在第二张截图中看到所有这些系列是如何排列在 svg 元素中的。

这就是我现在尝试点击的方式。我按照this SO question 中的解决方案构建了这个:

    parent = self.browser.find_element_by_id('student_chart')
    data_series = parent.find_elements_by_class_name('highcharts-series')
    data_rect = data_series[0].find_element_by_tag_name('rect')

    builder = ActionChains(self.browser)    

    series_click = builder.click(data_rect)
    series_click.perform()

感谢您的帮助!


更新

所以这看起来完全是胡闹,但是如果我使用 for 循环单击每个系列,最后一个“接受”并发生预期的 onClick 事件。但是,当我手动测试时,单击任何单个系列都可以。触发最后一个系列的代码是:

parent = self.browser.find_element_by_id('student_chart')
data_series = parent.find_elements_by_class_name('highcharts-series')

for series in data_series:
    rect = series.find_element_by_tag_name('rect')
    if rect.text == '':
        rect.click()

这似乎是为了让我的测试正常工作,所以我想知道是否有人知道为什么单击单个元素不起作用的根本原因,或者更清洁的方法来做到这一点?

谢谢!


更新 #2

所以我查看了 Robbie 在下面的回答中指出的库,它似乎使用 ActionChains 来构建与 HighCharts 的交互。该库很酷,显然适用于其他人,但作者似乎只跟踪鼠标悬停事件......当我为点击事件尝试以下代码的不同变体时,我只能让工具提示出现 - 没有点击事件.所以我似乎仍然卡住了。 ActionChains 似乎可以使用 Selenium 从 HighCharts 中读取工具提示和值,但点击事件对我来说似乎仍然是个谜……

parent = self.browser.find_element_by_id('student_chart')
data_series = parent.find_elements_by_class_name('highcharts-series')

series_number = 0
for series in data_series:
    if series_number == 0:
        click_object = series.find_element_by_tag_name('rect')
    else:
        pass
    series_number += 1

builder = ActionChains(self.browser)    

click_me = builder.click(click_object)
click_me.perform() 

【问题讨论】:

  • 嗨!你对这个问题有任何更新吗?我正在彻底遵循它并自己尝试一些事情。
  • 你好。对不起,我从来没有设法让它干净地工作。由于我只需要测试点击功能而不是特定(或每个)栏,因此我在第一次更新时使用了 for 循环,只需单击最后一个栏。如果有我错过的东西,我会很乐意尝试其他的东西并挖掘更多的东西。
  • 别担心!继续插入它不是你的工作。我只是想问也无妨!非常感谢!!
  • 嗨,你们有使用 Jasmine Javascript 实现相同目标的经验吗?提前致谢。

标签: selenium svg highcharts


【解决方案1】:

你检查过这个项目吗? https://github.com/Ardesco/Powder-Monkey/tree/master/src/main/java/com/lazerycode/selenium/graphs

当我去年在 Selenium C# 中自动化 Highcharts 时,我能够剖析这个 java 项目并获得很好的理解,然后用 C# 编写我自己的版本。

也许这能给你一些想法和提示

【讨论】:

  • 嗨 Robbie,感谢您提供指向其他项目的链接。我看了看它,它似乎很有帮助,但直到本周晚些时候我才能深入研究它,看看我是否能找到解决我的问题的方法。不过,我会密切关注这个线程,并让你知道。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多