Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用selenium web驱动程序选择复选框_Java_Selenium_Selenium Webdriver_Xpath_Webdriverwait - Fatal编程技术网

Java 如何使用selenium web驱动程序选择复选框

Java 如何使用selenium web驱动程序选择复选框,java,selenium,selenium-webdriver,xpath,webdriverwait,Java,Selenium,Selenium Webdriver,Xpath,Webdriverwait,在我的网页(或弹出窗口)中,有多个输入框和复选框。输入框和复选框位于单独的div标记中。以下是我的html代码: <div class="modal-body-large"> <div class="col-md-12 step-forms custom-tab-content"> <form class="form-horizontal form-sections">

在我的网页(或弹出窗口)中,有多个输入框和复选框。输入框和复选框位于单独的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>

我关心的是是否有其他方法可以这样做?

您可以使用uncle元素的文本。要获取您可以使用的
选择权限下的
选择所有

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

您可以使用
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();


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

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

使用
id
选中复选框,并将其传递给
XPath

driver.findElement(By.xpath(".//*[@id='permissions1565851434728']")).sendKeys(Keys.SPACE);
您可以单击复选框,而不是像下面这样发送键

WebElement checkBox = driver.findElement(By.id("permissions1565851434728"));
checkBox.click();
使用
将复选框传递给
css选择器
,选择复选框

WebElement checkBox = driver.findElement(By.cssSelector("input[value='Add/Update Network Security']"));
checkBox.click();
如果有两个复选框,您可以按如下方式使用

driver.FindElements(By.xpath("(//input[@type='checkbox'])[1]"));
driver.FindElements(By.xpath("(//input[@type='checkbox'])[2]")); ...
SeleniumWebDriver使用浏览器的本机方法与web组件交互。尽管如此,有时web组件不会对这些本机方法作出反应。在这种情况下,最可靠的选择是JavaScript

因此,您可以尝试使用以下JavaScript与web元素进行交互

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

((JavascriptExecutor)driver).executeScript("arguments[0].click();", element);
您还可以尝试使用所说的
WebDriverWait

  • 对于
    选择角色
    复选框:

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

  • 对于
    选择权限
    复选框,方法相同:

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

  • 若要
    单击与
    关联的复选框上的()

    • xpath

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

    使用值抛出异常选择复选框,即org.openqa.selenium.elementnotinteractitableexception:element not interactitableselect复选框使用id和那些id更改。id随时间而变化。findElements还表示org.openqa.selenium.elementnotinteractitableexception:element notinteractitableexception:element not interactitable我使用了第二个,表示org.openqa.selenium.elementnotinteractitableexception:element not interactitable我已经更新了代码,添加
    WebDriverWait
    并使用
    Actions
    。获得错误org.openqa.selenium.TimeoutException:预期条件失败:等待元素可单击:By.xpath://*[@type='checkbox'和contains(@id,'permissions')](每隔500毫秒尝试20秒)它正常工作。如果我想选择特定的权限,那么我只需要更改xpath。对吗?这回答了你的问题吗?
    //li[text()='Select permissions']/following-sibling::li/input
    
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//li[text()='Select permissions']//following::li[1]//label"))).click();