【问题标题】:Using highchart SVG images with Selenium在 Selenium 中使用 highchart SVG 图像
【发布时间】:2015-01-22 00:07:56
【问题描述】:

我在 Java 中运行 Selenium 测试时需要一些帮助,我在页面上有 SVG 高图表图像。我遇到的问题是我无法让 selenium 识别高图表上的每个元素,然后点击它们来触发另一个事件。

我在下面附上了一张截图,希望能突出我正在尝试做的事情

我认为屏幕截图上的 HTML sn-p 不是很清楚,所以我在下面概述了这一点:

    <div id="status-action-counts" class="two-by-two-chart" data-highcharts-chart="0">
        <div id="highcharts-0" class="highcharts-container" style="position: relative; overflow: hidden; width: 588px; height: 300px; text-align: left; line-height: normal; z-index: 0; font-family: "Lucida Grande","Lucida Sans Unicode",Verdana,Arial,Helvetica,sans-serif; font-size: 12px; left: 0.133331px; top: 0.916672px;">
            <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="588" height="300">
                <desc>Created with Highcharts 3.0.4</desc>
                <defs>
                <rect rx="5" ry="5" fill="#FFFFFF" x="0" y="0" width="588" height="300">
                <g class="highcharts-grid" zIndex="1">
                <g class="highcharts-grid" zIndex="1">
                <g class="highcharts-axis" zIndex="2">
                <g class="highcharts-axis" zIndex="2">
                <g class="highcharts-series-group" zIndex="3">
                    <g class="highcharts-series highcharts-tracker" visibility="visible" zIndex="0.1" transform="translate(62,51) scale(1 1)" style="cursor:pointer;" clip-path="url(#highcharts-1)">
                        <rect fill="#ECB631" x="26.5" y="52.5" width="49" height="121" stroke="#FFFFFF" stroke-width="1" rx="0" ry="0">
                        <rect fill="#ECB631" x="130.5" y="150.5" width="49" height="23" stroke="#FFFFFF" stroke-width="1" rx="0" ry="0">
                        <rect fill="#ECB631" x="233.5" y="168.5" width="49" height="5" stroke="#FFFFFF" stroke-width="1" rx="0" ry="0">
                        <rect fill="#ECB631" x="336.5" y="162.5" width="49" height="11" stroke="#FFFFFF" stroke-width="1" rx="0" ry="0">
                        <rect fill="#ECB631" x="439.5" y="17.5" width="49" height="156" stroke="#FFFFFF" stroke-width="1" rx="0" ry="0">
                    </g>
                    <g class="highcharts-markers" visibility="visible" zIndex="0.1" transform="translate(62,51) scale(1 1)">
                </g>

基本上,我想单击“指示代理”高图,然后它会触发一个事件并允许我继续我的测试。如果有人可以提供一些帮助来帮助我,我将不胜感激。

代码片段

    public static void terminatedReportCompletedBarGraphSelect(InternetExplorerDriver driver)
    {
        WebElement parent = driver.findElement(By.className("highcharts-series-group"));
        List<WebElement> children = parent.findElements(By.tagName("rect"));
        children[0].Click();
    }

更新 - 25/11/14 你好,我希望你能帮助解决我遇到的下一个问题。感谢您的帮助,我现在已经能够选择条形图了。然后这会打开另一个条形图,我想单击它上面的一个元素。问题是className是“Highcharts-series-group”,和我之前使用的元素定位器一样。我在下面附上了我要选择的选项的屏幕截图(它是右边的图表)

这是 HTML 的 sn-p,以防它不可见:

<div id="controller-breakdown" class="two-by-two-chart" style="display: block;" data-highcharts-chart="1">
    <div id="highcharts-2" class="highcharts-container" style="position: relative; overflow: hidden; width: 588px; height: 300px; text-align: left; line-height: normal; z-index: 0; font-family: "Lucida Grande","Lucida Sans Unicode",Verdana,Arial,Helvetica,sans-serif; font-size: 12px; left: 0.083313px; top: 0.916672px;">
        <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="588" height="300">
            <desc>Created with Highcharts 3.0.4</desc>
            <defs>
            <rect rx="5" ry="5" fill="#FFFFFF" x="0" y="0" width="588" height="300">
            <g class="highcharts-grid" zIndex="1">
            <g class="highcharts-grid" zIndex="1">
            <g class="highcharts-axis" zIndex="2">
            <g class="highcharts-axis" zIndex="2">
            <g class="highcharts-series-group" zIndex="3">
            <g class="highcharts-series highcharts-tracker" visibility="visible" zIndex="0.1" transform="translate(61,51) scale(1 1)" style="cursor:pointer;" clip-path="url(#highcharts-3)">
                <rect fill="#ECB631" x="67.5" y="32.5" width="124" height="183" stroke="#FFFFFF" stroke-width="1" rx="0" ry="0">
                <rect fill="#ECB631" x="325.5" y="118.5" width="124" height="97" stroke="#FFFFFF" stroke-width="1" rx="0" ry="0">
            </g>
            <g class="highcharts-markers" visibility="visible" zIndex="0.1" transform="translate(61,51) scale(1 1)">
            </g>

我希望通过编写下面的代码,我可以从右侧的图表中选择一个条形。我的想法是我需要以某种方式使用 'div id="controller-breakdown' 元素来识别我要访问的代码块,因为这是独一无二的。

public static void relationalBarChartSelector(InternetExplorerDriver driver)
{
    WebElement parent = driver.findElement(By.id("controller-breakdown"));
    List<WebElement> children = parent.findElements(By.tagName("rect"));
    children.get(1).click();
}

你有什么想法?

【问题讨论】:

    标签: java selenium svg highcharts selenium-webdriver


    【解决方案1】:

    这对我有用(恐怕是 c#)。没有一种简单的方法可以识别哪些数据在哪个矩形中,因此除非您已经知道系列的顺序,否则可能会出现问题:

    IList<IWebElement> bars = MyWebDriver.Driver.FindElements(By.TagName("rect"));
    foreach (var bar in bars)
    {
        Thread.Sleep(500);
        try
        {
            bar.Click();
        }
        catch (Exception e)
        {
        }
    }
    

    【讨论】:

    • 您好,感谢您的 cmets。仍然为此苦苦挣扎,我想我可能需要使用上面给出的具体示例进行一些指导
    • OK - 除非我遗漏了一些我看不到的复杂性,否则您只需使用 driver.FindElement(By.ClassName("highcharts) 选择图表中的条所在的父元素-series-group")),然后使用 parent.FindElement(By.TagName("rect")) 获取位于其下方的“rect”元素列表。您的“指导代理”栏将是列表中的第一个元素,因此请使用 children[0].Click() 单击它。
    • 道歉 - 应该是 parent.FindElements(By.TagName("rect"))。
    • 我已经完成了下面的代码 WebElement parent = driver.findElement(By.className("highcharts-series-group")); List children = parent.findElements(By.tagName("rect"));
    • 您能否告知我需要做什么才能使用第一个元素单击“指示代理”栏?
    【解决方案2】:

    希望这可能会有所帮助 - HighCharts

    【讨论】:

    • 你也可以查看this链接..谢谢..
    • 您好,感谢您的 cmets。仍然为此苦苦挣扎,我想我可能需要使用上面给出的具体示例进行一些指导
    猜你喜欢
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多