6

说我有以下

<div class="facetContainerDiv">
    <div>
        <label class="facetLabel">
            <input class="facetCheck" type="checkbox" />
        </label>
        <label class="facetLabel">
            <input class="facetCheck" type="checkbox" />
        </label>
        <label class="facetLabel">
            <input class="facetCheck" type="checkbox" />
        </label>
        <label class="facetLabel">
            <input class="facetCheck" type="checkbox" />
        </label>
        <label class="facetLabel">
            <input class="facetCheck" type="checkbox" />
        </label>
    </div>
</div>

现在我想根据我提供的索引在复选框上打一个复选标记。所以我写了一个如下的方法

如何访问 div class="facetContainerDiv" 中的所有元素?

我试过

List<WebElements> elementsList =  driver.findElements(By.cssSelector(".facetContainerDiv"));
for(WebElement checkBox:elementsList) {
    int i=0;
    checkBox = elementsList.get(i);
     bla bla bla..
}

在上面的代码中,elementsList 只有一个“type”为空的元素。

4

4 回答 4

7

请按照以下与您的情况完全匹配的代码进行操作。

  1. 为div下的div创建web元素的接口,facetContainerDiv

即对于

<div class="facetContainerDiv">
    <div>

    </div>
</div>

2. 创建一个 IList,其中包含第二个 div 中的所有元素,即

<label class="facetLabel">
   <input class="facetCheck" type="checkbox" />
</label>
<label class="facetLabel">
   <input class="facetCheck" type="checkbox" />
</label>
<label class="facetLabel">
   <input class="facetCheck" type="checkbox" />
</label>
<label class="facetLabel">
   <input class="facetCheck" type="checkbox" />
</label>
<label class="facetLabel">
   <input class="facetCheck" type="checkbox" />
</label>

3.使用索引访问每个复选框

请在下面找到代码

using System;
using System.Collections.Generic;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;

namespace SeleniumTests
{
  class ChechBoxClickWthIndex
    {
        static void Main(string[] args)
        {

            IWebDriver driver = new FirefoxDriver();

            driver.Navigate().GoToUrl("file:///C:/Users/chery/Desktop/CheckBox.html");

            // Create an interface WebElement of the div under div with **class as facetContainerDiv**
            IWebElement WebElement =    driver.FindElement(By.XPath("//div[@class='facetContainerDiv']/div"));
            // Create an IList and intialize it with all the elements of div under div with **class as facetContainerDiv**
            IList<IWebElement> AllCheckBoxes = WebElement.FindElements(By.XPath("//label/input"));
            int RowCount = AllCheckBoxes.Count;
            for (int i = 0; i < RowCount; i++)
            {
            // Check the check boxes based on index
               AllCheckBoxes[i].Click();

            }
            Console.WriteLine(RowCount);
            Console.ReadLine(); 

        }
    }
}
于 2013-03-21T07:53:36.427 回答
4

我不确定您的 findElements 语句是否为您提供了所有 div。我会尝试以下方法:

List<WebElement> elementsRoot = driver.findElements(By.xpath("//div[@class=\"facetContainerDiv\"]/div));

for(int i = 0; i < elementsRoot.size(); ++i) {
     WebElement checkbox = elementsRoot.get(i).findElement(By.xpath("./label/input"));
     checkbox.click();
     blah blah blah
}

这里的想法是您获取根元素,然后使用另一个“子”xpath 或您喜欢的任何选择器来查找节点元素。当然,可能需要调整 xpath 或选择器以正确找到所需的元素。

于 2013-03-21T03:52:47.287 回答
2

您要求提供 class 的所有元素facetContainerDiv,其中只有一个(最外层的 div)。为什么不做

List<WebElement> checks =  driver.findElements(By.class("facetCheck"));
// click the 3rd checkbox
checks.get(2).click();
于 2013-03-21T03:49:56.787 回答
0

或者,您可以尝试编写特定元素:

    //label[1] is the first element.
    el =  await driver.findElement(By.xpath("//div[@class=\"facetContainerDiv\"]/div/label[1]/input")));
    await el.click();

更多信息可以在这里找到:https ://www.browserstack.com/guide/locators-in-selenium

于 2020-02-25T16:10:24.053 回答