【问题标题】:Unable to get text from input element in selenium无法从硒中的输入元素获取文本
【发布时间】:2019-02-04 10:57:39
【问题描述】:

使用 Java/Spring 标记我编写了一个 html 文件,其中包含一些从数据库获取的单选按钮。现在我正在编写 Selenium 测试用例以单击该单选按钮。当我使用 excel 表读取值时,我的单选按钮值在 Excel 表中。那么如何使用 excel 中的文本识别单选按钮并从 Selenium WebDriver 中单击它。

我已尝试使用 Xpath 并循环通过 WebElement 并使用 getText() 方法仍然得到空文本。

实际HTML:

<html>
<div class="col-xs-6 col-md-6 prop_value">
<c:forEach items="${products}" var="productTemp">
<form:radiobutton style="margin-left : 30px"                             
path="${mtool.productDetail.productId}" class="radiobtn"                                             
name="product" value="${productTemp.productId}"/>${productTemp.productName} 
</c:forEach></div>
</html>

现在当我在浏览器中检查这个 Html 时生成如下

已检查的 Html:

<div class="col-xs-8 col-md-8 prop_title">
Product<span class="required">*</span>
<input id="1" name="product" style="margin-left : 30px" class="radiobtn" 
type="radio" value="1">CAR
<input id="2" name="product" style="margin-left : 30px" class="radiobtn" 
type="radio" value="2">BUS
<input id="3" name="product" style="margin-left : 30px" class="radiobtn" 
type="radio" value="3">TRUCK
<input id="4" name="product" style="margin-left : 30px" class="radiobtn" 
type="radio" value="4">TRAIN
<input id="5" name="product" style="margin-left : 30px" class="radiobtn" 
type="radio" value="5">AEROPLANE
</div>

这些值 CAR、BUS、TRUCK、TRAIN、AEROPLANE 存储在 Excel 表中。现在根据存储在 Excel 表中的值单击单选按钮,我编写 Selenium 代码如下。

Example.java

for(int i=0; i<totalRows; i++){
        cell = sheet.getRow(i).getCell(0);
        System.out.println(driver.findElement(By.xpath("//div[@class='col-xs-6 col-md-6 prop_value']")).getText());
        List<WebElement> elmnt=driver.findElements(By.xpath("//input[@name='product' and @class='radiobtn']/following-sibling::text()/parent::div/input"));
        for(WebElement list : elmnt){

            String text=list.getText();
            System.out.println("Text"+text);
            if(text.equalsIgnoreCase(cell.getStringCellValue())){
                list.click();
            }
        }

这只是与单选按钮相关的代码,所以我没有编写完整的类。现在我得到空文本,所以单选按钮没有被点击。所以有人可以让我知道如何做到这一点。谢谢你

【问题讨论】:

标签: java html spring selenium


【解决方案1】:

根据您的要求,我正在用单元格发布另一个答案。

for(int j=0; j<totalRows; j++){
         cell = sheet.getRow(j).getCell(0); 
        //Radio Button element 
         List<WebElement> elmnt = driver.findElements(By.xpath("//div[text()[contains(.,'')]]/input"));
         //It returns Entire Div Text  
         String[] parts =driver.findElement(By.xpath("//input[@name='product']/parent::div")).getText().split(" ");

         for (int i=1;i<parts.length;i++)
             {
                    System.out.println(parts[i]);
                    //Verifying cell value here.
                    if(parts[i].trim().equalsIgnoreCase(cell.getStringCellValue()))
                    {
                        elmnt.get(i-1).click();
                    }

              }

         }

请告诉我这是你在照顾的吗?

【讨论】:

    【解决方案2】:

    使用这个 xpath: List&lt;WebElement&gt; elmnt=driver.findElements(By.xpath("//input[@name='product']"));

    【讨论】:

    • 已经使用了这个 xpath 仍然没有得到文本。因为如果你看到 没有结束标记。但它是动态生成的
    • 哦,对不起,我错过了,可以使用 * 而不是 input。这可能会有所帮助
    • 它似乎不起作用。再次打印相同的空文本
    • Ohhh.. 但是您的用例是您从 excel 中选择值,然后单击网页上的该文本,对吗?因此,您可以使用 String productName=cell.getStringCellValue()driver.findElement(By.xpath("//*[text()="+productName+"]")).click(); 直接转到文本 xpath,您可以从 Excel 表中获取产品名称。如果这有帮助,请告诉我。
    • 当我试图在浏览器中使用 //*[text()="CAR"] 查找元素时,由于文本中有一些空格,我无法找到元素。
    【解决方案3】:

    你可以试试innerText:

    String text=list.getAttribute("innerText");
    

    【讨论】:

    • 我试过了,但文本中似乎有一些空格,所以当我打印文本时它打印为空
    • 你的意思是说,文本检索带有空格?还是只检索空格?
    • 好的,如果你在列表中看到它显示了 5 个元素。所以我的变量列表有 5 个元素。但是当我在做 list.getText() 时它正在打印空字符
    • 如果不需要每次 HTML 都检索 getText,如果是这样,我们必须使用像 innerText() 这样的替代方法
    【解决方案4】:

    你可以用其他方式。如果你想这样做。它会给你整个 'div' 文本值。然后你可以分割这个值并与你的 excel shell 值比较。

    //Radio Button element 
    List<WebElement> elmnt = driver.findElements(By.xpath("//div[text()[contains(.,'')]]/input"));
    //It returns Entire Div Text  
    String[] parts =driver.findElement(By.xpath("//input[@name='product']/parent::div")).getText().split(" ");
    
    for (int i=1;i<parts.length;i++)
        {
              System.out.println(parts[i]);
               elmnt.get(i-1).click();
               Thread.sleep(2000); //sleep i have used for testing purpose not required in real scenario.
        }
    

    【讨论】:

    • 现在很好,我可以获取文本,它似乎正在工作,谢谢。但是在 for 循环中,您正在迭代每个元素并单击它。但我的情况是所有值都将存储在 excel 表中因此,如果 excel 中的值为 CAR,则应单击 CAR 单选按钮。所以请帮帮我
    • 好的,我正在发布另一个答案来帮助您。如果有效,请接受我的代码。
    【解决方案5】:

    您可以使用下面的 xpath 获取输入,但最好要求开发人员添加关闭标签:

    //node()[normalize-space(.)='CAR']/preceding::input[1]
    
    //node()[normalize-space(.)='AEROPLANE']/preceding::input[1]
    

    【讨论】:

      猜你喜欢
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多