【问题标题】:How to select checkbox by passing the checkbox name - using Selenium / Webdriver如何通过传递复选框名称来选择复选框 - 使用 Selenium / Webdriver
【发布时间】:2012-09-19 13:25:03
【问题描述】:

HTML 源页面:

//开始:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <head>
        <title></title>
    </head>
    <body>
    <div id="ctl00_ContentPlaceHolder1_control1_pnlEdit">

     <h2>
        <span id="ctl00_ContentPlaceHolder1_control1_lblEditHeader">Add New</span></h2>
    <br /><br />


    <div>
        <table class="DetailsView" cellspacing="0" cellpadding="5" rules="all" border="1" id="ctl00_ContentPlaceHolder1_control1" style="height:50px;width:600px;border-collapse:collapse;">
            <tr>
                <td>&nbsp;</td><td>              
                    &nbsp;</td>
            </tr><tr>
                <td>Category</td><td>  
                    <div style="border-style: solid; border-width: 1px; border-color: inherit; overflow:auto; height:200px; width:300px;" >
                        <table id="ctl00_ContentPlaceHolder1_control1_lstCat" class="CheckBoxList" selectionmode="Multiple" border="0">
                    <tr>
                        <td><span style="padding-left:0px;"><input id="ctl00_ContentPlaceHolder1_control1_lstCat_0" type="checkbox" name="ctl00$ContentPlaceHolder1$control1$dv$lstCat$0" /><label for="ctl00_ContentPlaceHolder1_control1_lstCat_0">Item 
                            1</label></span></td>
                    </tr><tr>
                        <td><span style="padding-left:15px;"><input id="ctl00_ContentPlaceHolder1_control1_lstCat_1" type="checkbox" name="ctl00$ContentPlaceHolder1$control1$dv$lstCat$1" />Item 
                            1-2</span></td>
                    </tr><tr>
                        <td><span style="padding-left:15px;"><input id="ctl00_ContentPlaceHolder1_control1_lstCat_2" type="checkbox" name="ctl00$ContentPlaceHolder1$control1$dv$lstCat$2" /><span>Item 
                            1-3</span></span></td>
                    </tr><tr>
                        <td><span style="padding-left:15px;"><input id="ctl00_ContentPlaceHolder1_control1_lstCat_3" type="checkbox" name="ctl00$ContentPlaceHolder1$control1$dv$lstCat$3" /><span>Item 
                            1-4</span></span></td>
                    </tr><tr>
                        <td><span style="padding-left:0px;"><input id="ctl00_ContentPlaceHolder1_control1_lstCat_4" type="checkbox" name="ctl00$ContentPlaceHolder1$control1$dv$lstCat$4" /><span>Item 
                            2</span></span></td>
                    </tr><tr>
                        <td><span style="padding-left:15px;"><input id="ctl00_ContentPlaceHolder1_control1_lstCat_5" type="checkbox" name="ctl00$ContentPlaceHolder1$control1$dv$lstCat$5" /><span>Item 
                            2-1</span></span></td>
                    </tr><tr>
                        <td><span style="padding-left:0px;"><input id="ctl00_ContentPlaceHolder1_control1_lstCat_6" type="checkbox" name="ctl00$ContentPlaceHolder1$control1$dv$lstCat$6" /><span>Item 
                            3</span></span></td>
                    </tr><tr>
                        <td><span style="padding-left:15px;"><input id="ctl00_ContentPlaceHolder1_control1_lstCat_7" type="checkbox" name="ctl00$ContentPlaceHolder1$control1$dv$lstCat$7" /><span>Item 
                            3-1</span></span></td>
                    </tr>

                </table>     

                    </div>                                                   
                </td>
            </tr><tr>
                <td>&nbsp;</td><td>&nbsp;</td>
            </tr>
        </table>
    </div>    

</div>
    </body>
</html>

//结束

编辑: Selecting Element followed by text with Selenium WebDriver

我的问题和上面的帖子类似

结束编辑

下面是它在运行时呈现的我的页面源代码

我有一个为每个复选框生成的唯一复选框 ID,例如:

ctl00_ContentPlaceHolder1_Control1_stCat_1
ctl00_ContentPlaceHolder1_Control1_stCat_2
ctl00_ContentPlaceHolder1_Control1_stCat_3
..........................................
ctl00_ContentPlaceHolder1_Control1_stCat_8
etc..............

我的要求是:如果我通过Checkbox Text 那么它应该选择相关的复选框 例如:

如果我通过 Checkbox Text = Some text present..... 那么 Checkbox Id ctl00_ContentPlaceHolder1_Control1_stCat_1 应该被选中

PS:Item 1, Item 2只是真实数据中的一个例子我有一些随机的名字

下面是我生成的html代码:

<tr>
<td>Category</td>
<td>
<div style="border-style: solid; border-width: 1px; border-color: inherit; overflow:auto; height:200px; width:300px;">
<table id="ctl00_ContentPlaceHolder1_AddControl1_lstCat" class="CheckBoxList" border="0" selectionmode="Multiple">
<tbody>
<tr> 
  <td>
    <span style="padding-left:15px;">
    <input id="ctl00_ContentPlaceHolder1_Control1_stCat_1" type="checkbox" name="ctl00$ContentPlaceHolder1$AddControl1$cat$lstCat$1"/>
    <label for="ctl00_ContentPlaceHolder1_AddControl1_lstCat_8">Item 1</label>
    </span>
 </td>
</tr>

<tr> 
  <td>
    <span style="padding-left:15px;">
    <input id="ctl00_ContentPlaceHolder1_Control1_stCat_2" type="checkbox" name="ctl00$ContentPlaceHolder1$AddControl1$cat$lstCat$2"/>
    <label for="ctl00_ContentPlaceHolder1_AddControl1_lstCat_2">Item 2</label>
    </span>
  </td>
</tr>

<tr> 
  <td>
    <span style="padding-left:15px;">
    <input id="ctl00_ContentPlaceHolder1_Control1_stCat_3" type="checkbox" name="ctl00$ContentPlaceHolder1$AddControl1$cat$lstCat$3"/>
    <label for="ctl00_ContentPlaceHolder1_AddControl1_lstCat_3">Item 3</label>
    </span>
  </td>
</tr>

.............
..............
................
.................
more...............

【问题讨论】:

    标签: selenium webdriver selenium-webdriver


    【解决方案1】:
    int i=1;
    
    while(!driver.findElement(By.id("ctl00_ContentPlaceHolder1_Control1_stCat_"+i)).equals(null)){
    
        if(driver.findElement(By.id("ctl00_ContentPlaceHolder1_Control1_stCat_"+i)).getText()="Item1"){
    
            driver.findElement(By.id("ctl00_ContentPlaceHolder1_Control1_stCat_"+i)).click();
            break;
    
            }
    }
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      其实你可以稍微用点别的方法。

      String  cssSelectorChckbox1= "table[id='ctl00_ContentPlaceHolder1_AddControl1_lstCat']" tbody tr td>input[id='ctl00_ContentPlaceHolder1_Control1_stCat_1']";
      String cssSelectorChckboxLabel1="table[id='ctl00_ContentPlaceHolder1_AddControl1_lstCat']" tbody tr td>label[for='ctl00_ContentPlaceHolder1_AddControl1_lstCat_8']";
      
      //then you can use 2 js methods: one for click checkbox, second one for validation label text near chckbox:
      
      public void  clickOnTheElement(String cssLocator){
      JavascriptExecutor js = (JavascriptExecutor) driver;
              StringBuilder stringBuilder = new StringBuilder();
              stringBuilder.append("var x = $(\'"+cssLocator+"\');");
              stringBuilder.append("x.click();");
              js.executeScript(stringBuilder.toString());
      
      }
      
      public String getTextOfTheElement(String cssLocator)
      { JavascriptExecutor js = (JavascriptExecutor) driver;
              StringBuilder stringBuilder = new StringBuilder();
      
      stringBuilder.append("var x = $(\""+cssLocator+"\");");
              stringBuilder.append("return x.text().toString();")       ;
      
      
             String res= (String) js.executeScript(stringBuilder.toString());
             return res;
      }
      
      //using first method you are able to click on checkbox. 
      
      clickOnTheElement( cssSelectorChckbox1);
      //using second method you are able to verify that label near checkbox is correct:
      String actualCheckboxLabel=getTextOfTheElement(cssSelectorChckboxLabel1);
      Assert.assertTrue(actualCheckboxLabel.equals("expected text near checkbox"))
      

      希望这对你有所帮助)

      【讨论】:

        【解决方案3】:

        您可以使用 XPath 表达式,例如:

        driver.find_element_by_xpath("//input[normalize-space(../label) = 'Item 1']")
        

        【讨论】:

        • 似乎是要走的路,但尝试使用上述行但没有工作抱怨Unable to find element with xpath == //input[contains(../label,'Item 1')]driver.FindElement(By.XPath("//input[contains(../label,'Item 1')]")).Click();
        • 我没有您的完整页面,也不知道您使用的是哪个驱动程序。然而起作用的是:从您粘贴的html中复制从开始table标签到最后一个结束tr标签的所有内容,将其粘贴到文件中并添加一个结束表标签并保存为一些html文件。这样,XPath 就可以与 Firefox/Firebug/FirePath 结合使用。我强烈怀疑它也可以在测试用例中工作。 (问题在于不正确的级联 html 或我们在您的问题中看不到的其他内容)。
        • @AbuHamzah:有一个 html 代码提取,但不是您的完整页面,也没有完整的测试。事实上,它是无效的。为了测试它,我必须猜测你的意思并添加标签(比如一个开始表,一个结束 div,两个结束表)
        • 'Item' 和数字之间有很多额外的空格,所以 'Item 1' 不能匹配。如果您只搜索“项目”,它会找到标有“项目 1”的框。 (没有更多匹配,因为它是唯一一个带有label 的框)。如果您可以控制代码生成,请考虑对其进行调整。如果不是,您可能不想将 XPath 的 matches 与搜索模式一起使用。
        • 我的错字...你如何进行 xpath 的匹配?我尝试修剪但不匹配该项目.... ergggggggggggg
        猜你喜欢
        • 2017-06-09
        • 2017-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-25
        • 1970-01-01
        • 2021-07-19
        • 2023-04-02
        相关资源
        最近更新 更多