Selenium在特定div标签后单击其他div(在Xpath中指定)

时间:2017-12-20 19:57:00

标签: c# selenium

我需要帮助才能创建一个单击特定div标签的功能。以下是演练。

我有一个包含

的静态div标签
<div role="heading" tabindex="-1">...</div>

现在就在这个div之后,另一个是动态的

<div data-convid="AAQkADE3YTQxZjAyLTVkZTEtNDM3Ni05MjU2LWU0OTc3ODI1MjEwNgAQAP2rdT4x8K5Lo8nEGqTp+QI=" data-time="2017-12-19T13:43:35-05:00" id="_ariaId_447" aria-selected="true" tabindex="-1">...</div>

现在,在这个数据中,id是动态的,因此我无法在我的代码中指定单击特定ID或数据-idid。每当有更新或新记录时。上面的div会填充新的数据 - convid,id。只需将其作为电子邮件,只要您有新电子邮件,就会创建新的动态div。这与此类似。现在我如何点击创建的新行?

我在考虑为<div role="heading" tabindex="-1">...</div>指定Xpath,然后点击第一个div。但是不知道如何实现它。任何人都可以帮我吗?

如果您有任何问题或疑虑,请告诉我。如果这篇文章似乎具有误导性或其他任何内容,请不要降级或报告。请评论我将删除此帖。

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

以下XPath会成为您想要的吗?

//div[@role='heading'][@tabindex='-1']/following-sibling::div[@data-convid][1]
  • 选择第一个元素[1]
  • 使用属性data-convid [@data-convid]
  • 这是div ::div
  • 并且是以下兄弟/following-sibling
  • 具有属性角色=&#39;标题&#39的div的
  • 和tabindex =&#39; -1&#39; //div[@role='heading'][@tabindex='-1']

答案 1 :(得分:1)

我用Selenium和Awesomium完成的所有工作都让我决定像这样和更好的高级实现不适合这些工具,所以我采取了注入javascript来完成我的工作和javascript返回结果。

您可能会找到您正在寻找的解决方案,但最终您可能会发现,与我一样,只需注入javascript并返回结果是最简单的。

<强>示例:

IWebDriver driver; // assigned elsewhere
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("document.querySelectorAll('div[role=\"heading\"]+div')[0].click();");

答案 2 :(得分:0)

根据您的问题,最常见的<div>标记如下:

<div role="heading" tabindex="-1">...</div>

上面的<div>代码后跟另一个<div>代码,如下所示:

<div data-convid="AAQkADE3YTQxZjAyLTVkZTEtNDM3Ni05MjU2LWU0OTc3ODI1MjEwNgAQAP2rdT4x8K5Lo8nEGqTp+QI=" data-time="2017-12-19T13:43:35-05:00" id="_ariaId_447" aria-selected="true" tabindex="-1">...</div>

现在正好在<div>上面填充了新的data-convid,而 data-convid 属性的值是动态的,但您想要click()它。

此外,上面的<div>会填充新的data-convid。因此,对于创建的新行的click(),您可以参考最高XPath<div>属性设置为 role heading 后面跟<div> id _ariaId_ 开头(_ariaId_看起来如此作为静态字符串)如下:

"//div[@role='heading']//following::div[starts-with(@id, '_ariaId_')]"

Incase, _ariaId_ dynamic我们可以如下通用:

"//div[@role='heading']//following::div[1]"

也许您可以使用以下内容<div>进行更细化(将 ... 替换为 actual_text ):

"//div[@role='heading' and contains(.,'...']//following::div[starts-with(@id, '_ariaId_')]"
OR
"//div[@role='heading' and contains(.,'...']//following::div[1]"