Selenium:xpath follow-sibling兄弟姐妹有更多孩子

时间:2017-01-19 17:58:51

标签: c# html selenium xpath xpath-2.0

我希望以一种易于理解的方式描述我的问题/问题。

我有和html看起来像这样:

<div class="class-div">
	<label class="class-label">
		<span class="class-span">AAAA</span>
	</label>
	<div class="class-div-a">
		<textarea class="class-textarea">
		</textarea>
	</div>
</div>
<div class="class-div">
	<label class="class-label">
		<span class="class-span">BBBB</span>
	</label>
	<div class="class-div-a">
		<textarea class="class-textarea">
		</textarea>
	</div>
</div>

我想要TextArea的Xpath,其中Label的值是AAAA,用Selenium中的值填充它。

有点像这样...

wait.Until(ExpectedConditions.ElementIsVisible(
    By.XPath("//div[@class='class-div']/label[@class='class-label'][span[@class='class-span' and text()='AAAA']]/following-sibling::div[@class='class-div-a']/textarea[@class='class-textarea']"))).SendKeys(valueTextArea);

2 个答案:

答案 0 :(得分:2)

问题可能出现在服务员状态ExpectedConditions.ElementIsVisible

问题是你的<textarea>在selenium上下文中不是'可见的',可见性意味着元素存在于DOM中(这是真的)并且它的大小大于0px,这对于你的{{{0}来说可能是假的1}}元素。在java中,你会使用<textarea>而不是ExpectedConditions.presenceOfElement(),不知道它是如何进入C#但你得到了图片。

尝试看看它是否能解决您的问题。

答案 1 :(得分:0)

让我快速重新解释一下这个问题以确保理解,您需要一个xpath来查找与文本为AAAA的标签相关联的文本框。

在这种情况下你必须回到树上,这里有几种我可能会这样做的方法,尽管你的xpath看起来是正确的:

使用祖先来清楚你要移动到哪个元素(更好的IMO)

By.XPath("//label/span[text()='AAAA']/ancestor::div[@class='class-div']//textarea");

或者只是使用..

向上移动树
By.XPath("//label/span[text()='AAAA']/../../..//textarea");

如果您的xpath存在,请使用asikojevics答案。 C#方法是ExpectedConditions.ElementExists(By)

**** **** UPDATE

根据您对文本值后面的尾随空格的注释,这里是另一个xpath,在这种情况下应使用contains而不是text()=找到textarea。

By.XPath("//label/span[contains(text(),'AAAA')]/ancestor::div[@class='class-div']//textarea");