【问题标题】:Cannot click on input type = "radio" that is inside a HTML label?无法单击 HTML 标签内的输入类型 =“收音机”?
【发布时间】:2016-06-23 18:17:06
【问题描述】:

我有一个问题,我无法使用id="same-supplier-no" 来点击输入类型 = "radio":

<label for="same-supplier-no" ng-class="{checked: !ctrl.energyModel.BillViewModel.SameSupplier}" class="">

  <input type="radio" id="same-supplier-no" name="same-supplier" ng-model="ctrl.energyModel.BillViewModel.SameSupplier" ng-value="false" ng-change="ctrl.sameSupplierValueChanged(); ctrl.analyticsProvider.sendVirtualPageView('SameSupplierNo')" class="ng-pristine ng-untouched ng-valid" value="false">

   <span></span>No

</label>

当我这样做时在 Selenium 中:

driver.findElement(By.id("same-supplier-no")).click();

它说“元素不可见”。 HTML 中有以前的单选按钮,上面有标签,它们有标签的 ID(这个没有)。 我只是参考标签 id 并单击它,它就可以工作。但是这个没有标签的 ID,我想避免使用 xpath,但是,如果我别无选择,那么我将通过 xpath/css 选择。

我也尝试过通过定位器名称,即 By.className("same-supplier");并使用 For 循环和 if 语句来存储输入 type=radio 元素,仍然不起作用。

问题是:为什么我不能点击输入类型=“收音机”,为什么Selenium 看不到?是因为它嵌套在标签内吗?如果是这样,有谁知道我可以如何使用 id 或仅访问元素来单击它?

谢谢。

注意:我将 Java 7 用于 Selenium。

【问题讨论】:

    标签: java selenium selenium-webdriver cucumber-jvm


    【解决方案1】:

    从聊天对话中,我可以在您使用的网站上尝试一些东西。 radio 永远不会变得可见。因此,不可能在其上使用click() 方法。

    但是,包含此 radiolabel 是可见的。这意味着您可以在此标签上使用 click()

    driver.findElement(By.cssSelector("label[for='same-supplier-no']")).click();
    

    或者,如果您真的想使用radio 查找元素,您可以使用xpath

    driver.findElement(By.xpath("//*[@id='same-supplier-no']/parent::label")).click();
    

    【讨论】:

    • 或 driver.findElement(By.xpath("//div[@class='answer radio-ticks']/label[2]")).click();
    • 感谢 RemcoW,我知道这一点。我一直在为页面上的其他单选按钮使用标签。但是,问题是为什么我无法获得单选按钮的 ID。好像你已经回答过了。如果我错了,请纠正我:radioButtons 未设置为可见,因此当对其调用 click() 方法时,由于该元素未设置为可见,因此无法找到单击它,因此失败。您提供的两个 findElement 工作。我之前可以使用 xpath 来做到这一点,但第二个 findElement 非常好。你能解释一下“::”,它是对 CSS 标记的引用吗?
    • @DesignAndCode 你几乎是对的。即使它不可见,它也可以找到该元素。问题是如果 selenium 不可见,则无法单击它。至于::,它的作用是让您给出您正在寻找的元素的特定tag name。在这种情况下,它将查找 ID 为 same-supplier-no 且父级为 label 的任何元素。
    • 如果您将label 更改为div 会失败,因为没有ID 为same-supplier-no 的元素具有div 作为父元素。您还可以将label 替换为*,这意味着父元素是什么并不重要,只要获取它即可。
    • 啊,我明白了。因此,我会将其标记为正确答案。谢谢 RemcoW 和@LeonBarkan。你们俩都帮了大忙。
    【解决方案2】:

    使用动作点击标签,然后使用:

    Actions actions = new Actions(driver);
                    IWebElement menuHoverLink = driver.findElement(By.XPath("//label[@for='same-supplier-no']"));
                    actions.moveToElement(menuHoverLink);
                    actions.click();
                    actions.perform();
    
    driver.findElement(By.id("same-supplier-no")).click();
    

    【讨论】:

    • 使用action点击标签是什么意思?你的意思是有两个.click()?一个用于标签,然后一个用于 id?但是用户没有点击两次?
    • 它正在悬停以标记元素可见
    • 我现在要试一试并发布结果,你怎么知道是“悬停”使它不可见?
    • 我怀疑,单选按钮在容器中,有时当您单击它们时,您看不到的第一件事就是您专注于特定区域
    • c#中的动作语法,所以你的代码可能有一点不同,但功能是一样的。
    【解决方案3】:

    点击“查找邮政编码”按钮后,在下面添加两行代码 -

    WebDriverWait wait = new WebDriverWait(driver,10);
    wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath(".//*[@id='same-supplier-question']/div/div/label[2]/span"))));
    

    这对我来说已经奏效了...... 您可以将 xpath 从绝对更改为相对....

    【讨论】:

    • 感谢 Punkaaj。我已经知道如何通过 xpath 来 click() 它,但是,我想知道为什么不使用 xpath 就不能直接进入 ID。为什么它对硒不“可见”。 @RemcoW 回答了这个问题,他的解决方案比 Xpath 中的 ID 后面有许多子元素要干净得多。不利于框架的可维护性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2019-12-25
    • 2022-07-01
    • 2013-11-01
    • 2014-10-16
    • 1970-01-01
    相关资源
    最近更新 更多