我试图找到几年前在 Google Selenium 论坛上发布的这个问题的解决方案(我发现的最相似的东西......不幸的是,论坛中没有发布答案)。在我的 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 元素中的。
这就是我现在尝试点击的方式。我按照这个 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()