Selenium C#使用Id,Name或XPath找不到Element

时间:2017-09-07 15:28:16

标签: c# selenium xpath

我试图在面板(或表格,我不确定)内​​的页面上找到一个元素。使用ID或名称时,无法找到它。我现在正试图使用​​XPath找到元素,但遇到了麻烦。 Firebug不再受支持,我无法使用Firefox开发工具(复制XPath)找到它。我试过添加等待异常和切换帧。我尝试了以下代码:

web.FindElement(By.XPath("//td(@contains='FirstName'))")).SendKeys("Sarah");

这导致

  

“消息:OpenQA.Selenium.InvalidSelectorException:给定xpath   表达式“// td(@ contains ='FirstName'))”无效:SyntaxError:The   表达不是一种法律表达。“

当我在网页上使用Inspect Element时,输出为:

<tr>
  <td>First Name:</td>
  <td>
   <input id="ContentPlaceHolder1_ASPxRoundPane14_txtFirstName" name="ctl00$ContentPlaceHolder1$ASPxRoundPanel4$txtFirstName" type="text">
   <br>
   <span id="ContentPlaceHolder1_ASPxRoundPanel4_RequiredFieldValidator2" style="color:Red;visibility:hidden;">First Name must be entered</span>
  </td>
</tr>

我已经搜索了几天的解决方案,但我仍然空着。

3 个答案:

答案 0 :(得分:1)

正如我在评论中所说,你的表达是错误的。你不能包含@ a。 @表示元素中的属性。因此,您只想抓住ID中的特定部分&#34; FirstName&#34;。你需要使用&#34; contains()&#34;并且在括号内是放置要抓取的属性的位置。现在你正在谈论它的方式你说&#34; equals&#34;而且你没有指定一个属性。因此,如果你使用了一个属性,&#34;等于&#34;不会和#34;等于&#34;想要&#34;整体&#34;属性只等于&#34; FirstName&#34;,这不是你的&#34; ID&#34;属性,因为它不仅仅是&#34; FirstName&#34;。要搜索属性,您需要执行以下操作。

//input[contains(@id, 'FirstName')]

答案 1 :(得分:1)

您无法设置&#34;文字&#34; <td>元素的一部分,因为它是一个块级元素。

您需要设置输入文本。

您可以使用此选择器找到输入:

web.FindElement(By.CssSelector("td > input[id$='txtFirstName']")).SendKeys("The First Name")

这个CSS选择器的意思是(英文):

  

找到我<td>,然后立即继续该元素,找到一个输入,其id ends with&#34; txtFirstName&#34;

您可以看到其他内容并不多,但txtFirstName属性中的id看起来足够独特。

如果你想要它更简单(记住,K.I.S.S;))

只需使用

web.FindElement(By.CssSelector("input[id$='txtFirstName']")).SendKeys("The First Name")

答案 2 :(得分:0)

试试这个xpath:

`web.FindElement(By.XPath("//input[contains(@id,'FirstName')]")).SendKeys("Sarah");`