我正在尝试创建一个函数,通过“ By.Name ”上的 Partial 匹配来定位元素。但我不能让它发挥作用。
我尝试过不同的正则表达式排列(正如我在互联网上找到的那样),但不是那些作品。 即这个人找不到元素:
*var element = Driver.FindElements(By.ClassName("x-container")).First()
.FindElement(By.Name("//*[contains('Price')]"));*
这个会抛出编译错误:
*var element = Driver.FindElements(By.ClassName("x-container")).First()
.FindElement(By.Name([*='Price']));*
如果我指定完全匹配,它可以正常工作:
*var element = Driver.FindElements(By.ClassName("x-container")).First()
.FindElement(By.Name("RegularPrice"));*
这是我的html页面:
<tbody class=”x-container”> <tr class="first-row"> <td class="form-group">
<input type="text" name="Name" class="form-control x-name">
<span data-validation-for="Name" class="help-block hidden"></span> </td> <td class="form-group">
<input type="text" name="Color" class="form-control x-color-dropdown" disabled=""> </td> <td class="has-btn-copy-link">
<input type="number" name="RegularPrice" class="form-control">
<a data-field="RegularPrice" class="btn btn-link btn-copy-field x-copy-to-all">Copy to all</a> </td>
答案 0 :(得分:0)
因为By.Name不允许部分匹配 - 只有整个匹配
第一个例子是使用xpath表示法,我相信第二个是CSS。你不能混用和匹配这些东西。
除非迫切需要使用By.Name,否则只需切换到By.xpath
即可*var element = Driver.FindElements(By.ClassName("x-container")).First()
.FindElement(By.Xpath("./*[contains(@name,'Price')]"));*
注意:我不是C#程序员,因此语法可能不太正确。我的基础是我的Java经验
答案 1 :(得分:0)
您无法使用By.Name()
进行部分匹配,但您可以使用CSS选择器或XPath进行部分匹配。看看你的代码,我会改变一些事情:
当您使用.FindElements(locator).First()
时,您会找到与locator
匹配的所有元素,然后选择您可能知道的第一个元素。由于您只是选择第一个,因此可以使用.FindElement()
替换此代码。无论有多少场比赛,它都只返回第一场比赛。
您正在将.FindElement/s()
个电话联系在一起。每次调用find时,都在抓页。如果可能,您应该将定位器组合到一个定位器中,该定位器将找到您想要的元素。在这种情况下,它非常简单。我们可以使用CSS选择器:
.x-container [name*='Price']
.FindElement()
返回一个网络元素IWebElement
类型。您应该指定此项而不是使用var
。
您可以将这一切打包到下面的代码中
IWebElement element = Driver.FindElement(By.CssSelector(".x-container [name*='Price']"));
这将完成你的要求,只抓一次页面。