[英]Selenium C# - Find element by Id dynamically (Id name unknown)
[英]Selenium C# cannot find Element using Id, Name or XPath
我正在尝试在面板(或表格,我不确定)内的页面上找到一个元素。 使用ID或名称时,无法找到它。 我现在正在尝试使用XPath查找元素,但是遇到了麻烦。 Firebug不再受支持,我也无法使用Firefox开发工具(复制XPath)找到它。 我尝试添加等待异常和切换帧。 我尝试了以下代码:
web.FindElement(By.XPath("//td(@contains='FirstName'))")).SendKeys("Sarah");
这导致
“消息:OpenQA.Selenium.InvalidSelectorException:给定的xpath表达式“ // td(@ contains ='FirstName'))”无效:SyntaxError:该表达式不是合法表达式。
当我在网页上使用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>
我已经搜索了好几天的解决方案,但仍然空着。
正如我在评论中所说,您的表达是错误的。 您不能@包含。 @是元素中的属性。 因此,您只想获取ID中似乎是“名字”的特定部分。 您将需要使用“ contains()”,并且在括号内是放置要获取的属性的位置。 现在,您要进行的操作是说“等于”,而您没有指定属性。 因此,如果您使用属性,则“等于”将不起作用,因为“等于”希望“整个”属性仅等于“名字”,而“ ID”属性则不是这种情况,因为它不仅具有“名字”。 为了搜索属性,您需要执行以下操作。
//input[contains(@id, 'FirstName')]
您不能设置<td>
元素的“文本”,因为它是块级元素。
您需要设置输入文本。
您可以使用以下选择器找到输入:
web.FindElement(By.CssSelector("td > input[id$='txtFirstName']")).SendKeys("The First Name")
此CSS选择器的意思是(英文):
为我找到一个
<td>
,然后立即继续该元素,为我找到一个输入,该输入的id
ends with
“ txtFirstName”ends with
您可以看到没有太多事情txtFirstName
,但是id
属性中的txtFirstName
看起来足够唯一。
如果您想要更简单(请记住,KISS;))
只是使用
web.FindElement(By.CssSelector("input[id$='txtFirstName']")).SendKeys("The First Name")
试试这个xpath:
`web.FindElement(By.XPath("//input[contains(@id,'FirstName')]")).SendKeys("Sarah");`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.