Selenium无法通过xpath找到元素

时间:2013-06-27 19:18:26

标签: java xpath selenium selenium-webdriver element

我已经在这方面工作了一段时间。我正在使用Selenium和WebDriver版本2.33(包含所有浏览器)。我正在使用Java,它应该是任意的。我正在做的只是找到一个元素并将鼠标悬停在它上面,这是我在之前的代码中所做的。但由于某种原因,我不能让这个工作。我正在尝试使用此xpath获取一个元素,通过右键单击Chrome中HTML中的元素并单击“copy xpath”获得:

//*[@id="highcharts-10"]/svg/g[7]/g/rect[1]

这就是我试图获取元素的方式(由于“highcharts-10”动态变化):

//*[starts-with(@id, 'highcharts')]/svg/g[7]/g/rect[" + barOption + "]

barOption正确输入(我正试图通过一堆酒吧)

这是我的Java代码:

WebDriverWait wait = new WebDriverWait(getWebDriver(), 5);
WebElement element;
WebDriver driver = getWebDriver();
By by = By.xpath("//*[starts-with(@id, 'highcharts')]/svg/g[7]/g/rect[" + barOption + "]");
Actions action = new Actions(driver);
WebElement elem = wait.until(ExpectedConditions.visibilityOfElementLocated(by));
action.moveToElement(elem);
action.perform();

我在这里做错了什么?我尝试过使用switchTo()语句,但是没有iframe可以正确切换到。这是HTML的图片,因为我无法理解实际文本:

更新的HTML链接: http://i1250.photobucket.com/albums/hh527/dr4g1116/Capture_zps6e2bc1b9.png

有人对我有什么建议吗?请让我知道我做错了什么!

谢谢!

4 个答案:

答案 0 :(得分:2)

尝试CSS Selectors

By by = By.css('div[id^="highcharts"] g[class^="highcharts"] > g > rec')
我使用了

g.class_name,因为<g>标签的类名不可见。将该类名替换为正确的类名

答案 1 :(得分:0)

从与Amey的讨论中我推断出你只有一个高图。所以尝试使用类名直接搜索元素“highcharts-tracker”,即By.ClassName(“highcharts-tracker”),然后将鼠标悬停在此元素本身上。这正是你想要实现的目标。

答案 2 :(得分:0)

很抱歉看到您对我之前的回答发表评论。 您可以通过以下方式获取条形图中每个条形的值:

var barValues = new List<string>(); 
var actions = new Actions(webDriver); //webDriver is instance of selenium WebDriver.
var chartSeriesGroup = webDriver.FindElement(By.ClassName("highcharts-series-group"));
var chartSeries = chartSeriesGroup.FindElement(By.ClassName("highcharts-series"));
var rectTags = chartSeries.FindElements(By.TagName("rect")); //To get all bars in barchart.

foreach (var rect in rectTags)
{
   actions.MoveToElement(rect).Perform(); //Hover mouse on bar.
   var trendMarkers = webDriver.FindElement(By.ClassName("highcharts-tooltip"));
   barValues.Add(trendMarkers.Text); //Storing tooltip value of bar for later use.
}

我在当前项目中使用相同的方法获取条形图中的条形值。希望这会对你有所帮助。

注意:如果栏的工具提示显示其他信息,例如名称等以及值,那么您需要编写逻辑以从存储在barValues中的完整信息中提取值部分。

答案 3 :(得分:0)

我只想对此稍作更新。似乎selenium看不到SVG标签,所以说到这里,我需要找到一种方法来看看它们......如果我能找到方法,我会报告回来。

全部谢谢!