Selenium点击Highcharts系列

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

我尝试点击“highcharts-series”类的元素,这些元素的子元素,以及整个父元素“highcharts-series-group”。 我所取得的最大进展是通过点击该系列的儿童教程,因为我可以看到工具提示弹出(请参见截图)。 但没有点击行动 - 硒超时等待下一步。

在这里输入图像描述

一个原因可能是因为Highcharts组容器(highcharts-series-group)的zIndex比我想要点击的元素(3与0.1)高。 但点击整个群组什么也不做,在真正的浏览器中,我相信我点击了一个实际的系列,而不是群组容器 - 所以我认为它既然在真实的浏览器中工作,zIndex也不应该影响我的点击? 您可以看到所有这些系列如何排列在第二个屏幕截图的svg元素中。

在这里输入图像描述

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

    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()

谢谢你的帮助!


UPDATE

所以这看起来完全有点麻烦,但是如果我使用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() 

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

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

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

链接地址: http://www.djcxy.com/p/15643.html

上一篇: Selenium click on Highcharts series

下一篇: Switching Fragments or Activities (ie layouts) on Orientation Change