【问题标题】:Selenium : xpath following-sibling where siblings have more childrenSelenium : xpath following-sibling 兄弟姐妹有更多孩子的地方
【发布时间】:2017-06-04 13:17:22
【问题描述】:

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

我有一个看起来像这样的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>

我希望标签值为 AAAA 的 TextArea 的 Xpath 用 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);

【问题讨论】:

  • 这看起来是正确的XPath。它有什么问题?
  • Selenium 不会“看到”文本区域。我得到一个超时异常。

标签: c# html selenium xpath xpath-2.0


【解决方案1】:

问题可能出在这个服务员状态,ExpectedConditions.ElementIsVisible

问题是您的 &lt;textarea&gt; 在 selenium 上下文中不是“可见的”,可见性意味着元素存在于 DOM 中(这是真的)并且它的大小大于 0px 这对于您的 &lt;textarea&gt; 元素可能是错误的.在 java 中,您将使用 ExpectedConditions.presenceOfElement() 而不是 ExpectedConditions.visibilityOfElement(),不确定它在 C# 中的运行方式,但您明白了。

试试看能不能解决你的问题。

【讨论】:

  • 我对此进行了快速测试,我认为您是正确的。使用页面工厂模型:[FindsBy(How = How.XPath, Using = "//label/span[text()='AAAA']/ancestor::div[@class='class-div']//textarea ")] 私有只读 IWebElement _textAreaAAAA = null;并创建一种在 AAAA 字段中输入值的方法对我来说效果很好。
  • @acikojevic,问题绝对不在于ExpectedConditions.ElementIsVisible。我之所以这么说,是因为当我更改我的 xpath 以显式查找 &lt;textarea&gt; 的 id 属性(我不想这样做)时,&lt;textarea&gt; 对 selenium 是可见的。
  • Rico 如果您在调试模式下运行它并逐步执行它并使用 driver.FindElement(By.Xpath("//label/span[text()='AAAA']/ancestor: :div[@class='class-div‌​']//textarea")).SendKeys("abcde");
【解决方案2】:

让我快速重新表述问题以确保我理解,您需要一个 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)

****更新****

根据您对文本值后尾随空格的评论,这是另一个在这种情况下应该找到文本区域的 xpath,使用 contains 而不是 text()=

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

【讨论】:

  • 实际上,您的 xpath 在再看一遍后看起来还不错……不确定您的 xpath 有什么问题。它使用了一些我不习惯的方法,所以我不得不仔细观察,但它似乎很好。我认为@acikojevic 可能走在正确的轨道上
  • 你是对的。我的 Xpath 确实是正确的。问题是在我的原始 html 代码中,在我的 &lt;span&gt; 元素的文本值之后有一个空格(我忽略了)。谢谢!
  • 很高兴您发现了问题!如有必要,您可以通过在 xpath 中使用 [contains(text(),'AAAA')] 来处理随机的前导或尾随空格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多