Selenium如何通过部分By.Name定位元素(在C#中)

时间:2018-04-03 19:26:34

标签: c# selenium-webdriver

我正在尝试创建一个函数,通过“ 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>

2 个答案:

答案 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进行部分匹配。看看你的代码,我会改变一些事情:

  1. 当您使用.FindElements(locator).First()时,您会找到与locator匹配的所有元素,然后选择您可能知道的第一个元素。由于您只是选择第一个,因此可以使用.FindElement()替换此代码。无论有多少场比赛,它都只返回第一场比赛。

  2. 您正在将.FindElement/s()个电话联系在一起。每次调用find时,都在抓页。如果可能,您应该将定位器组合到一个定位器中,该定位器将找到您想要的元素。在这种情况下,它非常简单。我们可以使用CSS选择器:

    .x-container [name*='Price']
    
  3. .FindElement()返回一个网络元素IWebElement类型。您应该指定此项而不是使用var

  4. 您可以将这一切打包到下面的代码中

    IWebElement element = Driver.FindElement(By.CssSelector(".x-container [name*='Price']"));
    

    这将完成你的要求,只抓一次页面。