我希望以一种易于理解的方式描述我的问题/问题。
我有和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);
答案 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");