Selenium无法通过xpath找到元素

我已经在这工作了一段时间了 . 我正在使用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的图片,因为我无法得到实际文本:

UPDATED HTML LINK: http://i1250.photobucket.com/albums/hh527/dr4g1116/Capture_zps6e2bc1b9.png

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

谢谢!!

回答(4)

3 years ago

试试CSS Selectors

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

g.class_name 我用过,因为 <g> 标签的类名不可见 . 用适当的类名替换该类名 .

3 years ago

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

3 years ago

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

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.
}

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

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

3 years ago

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

谢谢大家!