sal*_*d11 4 html c# selenium xpath
我有这样的结构:
<div class="Container">
<div class="HighlightContainer">
<div class="NodeTextHighlightContainer">
<span class="TreeItemSelected">Products</span>
</div>
<button class="ContainerSelectedMenu" type="button"></button>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
由于 DOM 的行为方式并试图保持动态,我只能定位包含文本产品的范围。使用类似的东西:
Driver.FindElement(By.XPath("//div[contains(@class, 'Container')]/descendant::span[text() = 'Products']"));
Run Code Online (Sandbox Code Playgroud)
但是,我需要class="ContainerSelectedMenu"根据该跨度元素定位按钮,最好的方法是什么?类似于获取 Container 子元素的父 div 然后找到按钮元素。
我已经找到了不同的方法来通过上下遍历来做到这一点,这很好用,但我现在更喜欢这种方法:
xpath = "//div[contains(@class, 'Container') and descendant::span[text() = 'Products']]//button";
Run Code Online (Sandbox Code Playgroud)
基本上,您将后代text() = 'Products'作为div您真正想要的标签(即父代)的要求的一部分。然后您可以使用//button, 或//button[@class='ContainerSelectedMenu']
您实际上不需要descendant此处的轴,因此可以通过以下方式对其进行简化:
xpath = "//div[contains(@class, 'Container') and .//span[text() = 'Products']]//button";
Run Code Online (Sandbox Code Playgroud)
用英语...
div那个@class包含“容器”和span带有文本`Products的后代元素div是一个button