【问题标题】:How to select checkbox using selenium web driver [duplicate]如何使用硒网络驱动程序选择复选框[重复]
【发布时间】:2019-08-15 07:21:25
【问题描述】:

在我的网页(或弹出窗口)中,有多个输入框和复选框。输入框和复选框位于单独的 div 标签中。这是我的html代码:

<div class="modal-body-large">
    <div class="col-md-12 step-forms custom-tab-content">
        <form class="form-horizontal form-sections">
            <div class="form-group">
                <label class="control-label col-sm-2">Username<span class="red">*</span></label>
                <div class="col-sm-10">
                    <input name="userId" class="form-control custom-form-control" type="text" placeholder="Username" value="">
                </div>
            </div>
            <div class="form-group">
                <label class="control-label col-sm-2">Email<span class="red">*</span></label>
                <div class="col-sm-10">
                    <input name="email" class="form-control custom-form-control" type="text" placeholder="Email" value="">
                </div>
            </div>
            .....
        </form>
    </div>
    <div class="col-md-12 step-forms custom-tab-content">
        <form class="form-horizontal"><span class="help-block" style="font-size: small;"><i>Note: Optional</i></span>
            <div class="col-md-6">
                <div>
                    <div class="form-sections">
                        <ul>
                            <li>Select permissions</li>
                            <li>
                                <input type="checkbox" id="permissions1565851434728" name="permissions">
                                <label for="permissions1565851434728" class="xh-highlight">Select all</label>
                            </li>
                        </ul>
                        <div class="searchbox-container">
                            <div class="check-list">
                                <ul>
                                    <li title="">
                                        <input type="checkbox" id="371565851434728" name="permissions" value="Add/Update Network Security">
                                        <label for="371565851434728" class="">Add/Update Network Security</label>
                                    </li>
                                    <li title="">
                                        <input type="checkbox" id="111565851434728" name="permissions" value="Add/Update Permissions">
                                        <label for="111565851434728" class="">Add/Update Permissions</label>
                                    </li>
                                    .....
                                </ul>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-md-6">
                <div class="form-sections">
                    <ul>
                        <li>Select roles</li>
                        <li>
                            <input type="checkbox" id="roles1565851434730" name="roles">
                            <label for="roles1565851434730">Select all</label>
                        </li>
                    </ul>
                    <div class="searchbox-container">
                        <div class="check-list">
                            <ul>
                                <li title="Update User Details,Create User,Create Project">
                                    <input type="checkbox" id="role-c98974c6-a4b1-4428-9d9e-7df9f00acd351565851434730" name="roles" value="test">
                                    <label for="role-c98974c6-a4b1-4428-9d9e-7df9f00acd351565851434730">test</label>
                                </li>
                                .....
                            </ul>
                        </div>
                    </div>
                </div>
            </div>
        </form>
    </div>
</div>

当我来到这个页面时,我可以成功地在输入字段中输入文本。当谈到选择复选框时,我必须为该复选框提供完整的 xpath。就像,如果我想选择复选框全选,我将 xpath 作为

"/html/body/div[@id='app']/div[@class='_loading-overlay']/main/div[@class='container-fluid search_table_container']/div[1]/div[@class='identity-management']/div[@class='row identity-list']/div/div[@class='filter-head col-md-12']/div[@class='search_right']/div[@class='modal fade in']/div[@class='modal-dialog modal-lg']/div[@class='modal-content']/div[@class='modal-body-large']/div[@class='col-md-12 step-forms custom-tab-content'][2]/form[@class='form-horizontal']/div[@class='col-md-6'][1]/div/div[@class='form-sections']/ul/li[2]/label"

我担心是否有任何替代方法可以做到这一点?

【问题讨论】:

标签: java selenium selenium-webdriver xpath webdriverwait


【解决方案1】:

将与&lt;label&gt; 关联的复选框 上的click() 设为全选,因为所需元素位于模态对话框中您必须为elementToBeClickable() 诱导WebDriverWait,您可以使用以下Locator Strategy

  • xpath:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//li[text()='Select permissions']//following::li[1]//label"))).click();
    

【讨论】:

  • 成功了。如果我想选择特定的权限,那么我只需要更改 xpath。对吗?
【解决方案2】:

您可以使用 uncle 元素的文本。要在Select permissions 下获取Select all,您可以使用

//li[contains(., 'Select permissions')]/following-sibling::li/label

【讨论】:

    【解决方案3】:
    1. 对于Select Roles 复选框:

      //li[text()='Select roles']/following-sibling::li/input
      

    2. 对于Select Permissions复选框同样的做法:

      //li[text()='Select permissions']/following-sibling::li/input
      
    3. following-sibling 是 XPath Axis 返回具有相同父节点的下一个节点,text()XPath function 匹配节点文本内容

    【讨论】:

      【解决方案4】:

      您可以使用xpath,并使用WebDriverWait 使元素存在,然后使用Actions,试试这个:

      new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@type='checkbox' and contains(@id,'permissions')]")));
      WebElement elmnt = driver.findElement(By.xpath("//*[@type='checkbox' and contains(@id,'permissions')]"));
      Actions act = new Actions(driver);
      act.moveToElement(elmnt).click().build().perform();
      

      或者

      new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("(//*[@type='checkbox'])[1]")));
      WebElement elmnt = driver.findElement(By.xpath("(//*[@type='checkbox'])[1]"));
      Actions act = new Actions(driver);
      act.moveToElement(elmnt).click().build().perform();
      

      如果您需要另一个复选框,请将 [1] 更改为 [2] 等。

      【讨论】:

      • 我用了第二个它说 org.openqa.selenium.ElementNotInteractableException: element not interactable
      • 我已经更新了代码,添加WebDriverWait并使用Actions
      • 得到一个错误 org.openqa.selenium.TimeoutException: 预期条件失败: 等待元素可点击: By.xpath: //*[@type='checkbox' and contains(@id, 'permissions')] (尝试 20 秒,间隔 500 毫秒)
      【解决方案5】:

      选择复选框类似于单击按钮。我看到所有复选框都有id,某些复选框也有value 字段。所以你可以使用以下方法来完成你所需要的。

      通过将id 传递给XPath 来选择复选框,

      driver.findElement(By.xpath(".//*[@id='permissions1565851434728']")).sendKeys(Keys.SPACE);
      

      您可以单击复选框而不是发送如下键,

      WebElement checkBox = driver.findElement(By.id("permissions1565851434728"));
      checkBox.click();
      

      通过将value 传递给CSSSelector 来选择复选框,

      WebElement checkBox = driver.findElement(By.cssSelector("input[value='Add/Update Network Security']"));
      checkBox.click();
      

      如果有 2 个复选框,您可以如下使用,

      driver.FindElements(By.xpath("(//input[@type='checkbox'])[1]"));
      driver.FindElements(By.xpath("(//input[@type='checkbox'])[2]")); ...
      

      Selenium WebDriver 使用浏览器的本地方法与 Web 组件进行交互。尽管如此,有时 Web 组件不会对这些本地方法做出反应。在这种情况下,您最可靠的选择是 JavaScript。

      所以你可以试试下面的 JavaScript 来与 web 元素交互,

      WebElement element = driver.findElement(By.cssSelector("input[value='Add/Update Network Security']"));
      
      ((JavascriptExecutor)driver).executeScript("arguments[0].click();", element);
      

      你也可以试试DebanjanB所说的WebDriverWait

      【讨论】:

      • 使用抛出异常的值选择复选框,即 org.openqa.selenium.ElementNotInteractableException: element not interactable
      • 使用 id 选择复选框并且那些 id 更改。该 ID 会按时更改。
      • findElements 也说 org.openqa.selenium.ElementNotInteractableException: element not interactable
      猜你喜欢
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多