Selenium C#找不到使用Id、名称或XPath的元素

Selenium C#找不到使用Id、名称或XPath的元素,c#,selenium,xpath,C#,Selenium,Xpath,我试图在面板(或表,我不确定)内的页面上找到一个元素。使用ID或名称时,无法找到它。我现在尝试使用XPath查找元素,但遇到了问题。Firebug不再受支持,我也无法使用Firefox开发工具(复制XPath)找到它。我尝试过添加等待异常和切换帧。我尝试了以下代码: web.FindElement(By.XPath("//td(@contains='FirstName'))")).SendKeys("Sarah"); 这导致 “消息:OpenQA.Selenium.InvalidSelecto

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

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

“消息:OpenQA.Selenium.InvalidSelectorException:给定xpath 表达式“//td(@contains='FirstName'))”无效:语法错误:错误 表达不是合法表达。”

当我在网页上使用Inspect元素时,输出如下:

<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>

名字:

必须输入名字
我已经寻找了好几天的解决方案,但仍然是空的

试试这个xpath:

`web.FindElement(By.XPath("//input[contains(@id,'FirstName')]")).SendKeys("Sarah");`
请尝试以下xpath:

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

正如我在评论中所说,你的表达是错误的。你不能@a contains.@用于元素中的属性。所以你只需要抓取ID的一个特定部分,它看起来像是“名字”。您需要使用“contains()”,括号内是您要获取的属性所在的位置。现在,您正在使用的方法是说“等于”,而不是指定属性。因此,如果使用属性,“equals”也不会起作用,因为“equals”希望“整个”属性只等于“FirstName”,而在“ID”属性中则不是这样,因为它不仅仅包含“FirstName”。要搜索属性,需要执行以下操作

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

正如我在评论中所说,你的表达是错误的。你不能@a contains.@用于元素中的属性。所以你只需要抓取ID的一个特定部分,它看起来像是“名字”。您需要使用“contains()”,括号内是您要获取的属性所在的位置。现在,您正在使用的方法是说“等于”,而不是指定属性。因此,如果使用属性,“equals”也不会起作用,因为“equals”希望“整个”属性只等于“FirstName”,而在“ID”属性中则不是这样,因为它不仅仅包含“FirstName”。要搜索属性,需要执行以下操作

//input[contains(@id, 'FirstName')]
不能设置
元素的“文本”,因为它是块级元素

您需要设置输入的文本

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

web.FindElement(By.CssSelector("td > input[id$='txtFirstName']")).SendKeys("The First Name")
此CSS选择器表示(英文):

为我找到一个
,然后立即继续该元素,为我找到一个输入,它的
id
txtFirstName>结尾

您可以看到没有太多的内容,但是
id
属性中的
txtFirstName
看起来足够独特

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

只用

web.FindElement(By.CssSelector("input[id$='txtFirstName']")).SendKeys("The First Name")
不能设置
元素的“文本”,因为它是块级元素

您需要设置输入的文本

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

web.FindElement(By.CssSelector("td > input[id$='txtFirstName']")).SendKeys("The First Name")
此CSS选择器表示(英文):

为我找到一个
,然后立即继续该元素,为我找到一个输入,它的
id
txtFirstName>结尾

您可以看到没有太多的内容,但是
id
属性中的
txtFirstName
看起来足够独特

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

只用

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


如果从末尾删除.SendKeys(),是否仍会出现错误?是否尝试使用
web.FindElement(By.Id)(“contentplaceholder 1\u ASPxRoundPane14\u txtFirstName”)
?这似乎是一个输入名字值的文本框。嗯,因为它不是一个合法的表达式,这就是为什么你会得到这个例外。你想得到什么元素?你的表达式是错误的,你试图获取它的文本似乎也错了。我看到的唯一一个地方是“FirstName”在输入的ID中。这是您试图获取的元素吗?输入元素?我在下面回答了它,请检查它是否对您有效。它已在我这边测试过是否有效。如果从末尾删除.SendKeys(),您是否仍会收到错误?您是否尝试过使用
web.FindElement(By.ID)(“contentplaceholder 1\u ASPxRoundPane14\u txtFirstName”)
?这似乎是一个输入名字值的文本框。嗯,因为它不是一个合法的表达式,这就是为什么你会得到这个例外。你想得到什么元素?你的表达式是错误的,你试图获取它的文本似乎也错了。我看到的唯一一个地方是“FirstName”在输入的ID中。这是您试图获取的元素吗?输入元素?我在下面回答了它,请检查它是否对您有效。它已经过测试,在我这边有效。我非常确定您需要在回答中留下更多信息。这仍然返回“消息:OpenQA.Selenium.NoSuchElementException:无法定位元素://td[contains(text(),'FirstName')]”我很确定您需要在回答中留下更多信息。这仍然返回“消息:OpenQA.Selenium.NoSuchElementException:无法定位元素://td[contains(text(),'FirstName')”“谢谢!!!!!这成功了。我可以不再把头撞在墙上了。XPath和CssSelector对我来说是新的。我真的很感谢您的帮助。很高兴听到它成功了,而且您可以避免头痛!点击“复选标记”将此问题标记为答案。”下面是上下投票图标。我的也是对的,我解释了为什么你的不起作用。我接受了上面的答案,因为我可以复制和粘贴。我是新来的,需要这么简单的东西。我不能用你的答案来做。谢谢你的输入。谢谢你!!!!!这起作用了。我可以不再把头撞在墙上了。XPath and CssSelector对我来说是新来的。我真的很感谢你的帮助。很高兴听到它起作用了,而且你可以从灾难中解脱出来