使用类和文本查找由 Ajax-json 响应加载的元素的 xpath

Posted

技术标签:

【中文标题】使用类和文本查找由 Ajax-json 响应加载的元素的 xpath【英文标题】:Finding xpath for an element loaded by Ajax-json response using class and text 【发布时间】:2014-11-24 21:44:03 【问题描述】:

我有一个类似的元素

<td class="google-visualization-table-th gradient google-visualization-table-sorthdr">
Project Name
<span class="google-visualization-table-sortind">▼</span>
</td>

我试过了

 driver.findElement(By.xpath("//td[contains(@class, 'google-visualization-table-th') and normalize-space(text()) = 'Project Name']")

但它不起作用。基本上它的列标题代码,我需要识别每个列标题并打印标题是否存在。

【问题讨论】:

你能详细说明“不工作”吗? @Mathias 它没有捕捉到所需的元素。给出“找不到元素错误” 【参考方案1】:

现在解决了,元素没有被识别,因为它们被加载到 iframe 中。我使用以下代码切换到 iframe,然后进行常规操作来跟踪元素。

WebDriverWait wait = new WebDriverWait(driver, 200);
By by = By.id("iframe id");
try 
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(by));

感谢大家的帮助。

【讨论】:

【参考方案2】:

我们不知道您使用的是哪个版本的 XPath,但根据具体版本,text() 的含义不同。

我怀疑span(奇怪的字符▼)的文字内容也是td/text()的一部分。这是因为text() 不是的意思是:

返回上下文节点的rext节点

在这种情况下,它意味着:

返回上下文节点的文本节点及其所有后代的文本节点。

在谓词的后半部分也使用contains()

//td[contains(@class, 'google-visualization-table-th') and contains(.,'Project Name')]

【讨论】:

谢谢,但它不起作用,仍然给出同样的错误。要添加的一件事是页面的内容是由 AJAX-JSON 响应生成的,这需要 3 分钟才能加载,为此我添加了 MySuite.driver.manage().timeouts().implicitlyWait(200, TimeUnit.秒);

以上是关于使用类和文本查找由 Ajax-json 响应加载的元素的 xpath的主要内容,如果未能解决你的问题,请参考以下文章

JVM(Java SE 11版本)加载类和接口

JVM之类加载器

JavaScript之Ajax-Json

AJAX-JSON

一个js编写全选弹出对话框ajax-json的案例

第二百三十六节,Bootstrap辅组类和响应式工具