我试图在面板(或表格,我不确定)内的页面上找到一个元素。使用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>
我已经搜索了几天的解决方案,但我仍然空着。
答案 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");`