【问题标题】:element not clickable for radio options单选选项不可点击的元素
【发布时间】:2019-10-03 03:38:23
【问题描述】:

我正在尝试使用find_element_by_xpath 查找所有元素。在下面的网页元素中,我分别寻找这三个元素:

1.  <label for="hw-log-mode-none" class="ng-binding">None</label>
2.  <label for="hw-log-mode-session" class="ng-binding">Per-Session</label>
3.  <label for="hw-log-mode-mapping" class="ng-binding">Per-Mapping</label>

        <div class="field ng-scope" ng-if="!isTransparentMode &amp;&amp; showNatPool &amp;&amp; !policy.isIPv6" ng-show="policy.action == 'accept' &amp;&amp; policy.nat == 'enable'">
            <label class="ng-binding">Hardware Logging Mode</label>
            <div>
                <div class="radio-group">
                <input type="radio" id="hw-log-mode-none" value="none" ng-model="policy['hw-logging-mode']" class="ng-pristine ng-untouched ng-valid" name="670">
                    <label for="hw-log-mode-none" class="ng-binding">None</label>
                <input type="radio" id="hw-log-mode-session" value="session" ng-model="policy['hw-logging-mode']" class="ng-valid ng-dirty ng-touched" name="671" style="">
                    <label for="hw-log-mode-session" class="ng-binding">Per-Session</label>
                <input type="radio" id="hw-log-mode-mapping" value="mapping" ng-model="policy['hw-logging-mode']" class="ng-valid ng-dirty ng-touched ng-valid-parse" name="672" style="">
                    <label for="hw-log-mode-mapping" class="ng-binding">Per-Mapping</label>
                </div>
            </div>
        </div>

我可以在上面的列表中找到元素 #1#2。但是当我尝试使用相同的方式查找元素 #3 时:

elem = driver.find_element_by_xpath("//label[@for='hw-log-mode-mapping']")

我收到了这个错误:

消息:元素点击被拦截:元素...不是 在点 (707, 508) 可点击。其他元素会收到点击: ...(会话信息:chrome=77.0.3865.90)

【问题讨论】:

  • 您需要添加动态等待,直到元素可点击。你能添加完整的堆栈跟踪吗
  • 我不知道动态等待是否是这里的解决方案。页面上的布局可能会阻塞元素。
  • 我在 elem.click() 之前添加了一行:time.sleep(1)。但是还是看到这个异常:

标签: python-3.x selenium radio-button


【解决方案1】:

您可以尝试使用 Javascript 单击该元素,看看是否可以解决该错误。

elem = driver.find_element_by_xpath("//label[@for='hw-log-mode-mapping']")
driver.execute_script("arguments[0].click();", elem)

如果这不起作用,您可以尝试单击 input 元素本身。

elem = driver.find_element_by_xpath("//input[@id='hw-log-mode-mapping']")
driver.execute_script("arguments[0].click();", elem)

【讨论】:

    【解决方案2】:

    试试这个,获取所有元素的列表,因为它们具有相同的类名,如下所示:

    List<WebElement> elements = driver.findElements(By.xpath(".//label[@class='ng-binding']"));
    

    现在创建一个方法来选择单选选项,如下所示:

    public void selectRadioOption(String option){
        if(option.equals("None"))
              elements.get(0).click();
        else if(option.equals("Per-Session"))
              elements.get(1).click();
        else if(option.equals("Per-Mapping"))
              elements.get(2).click();
    }
    

    调用这个方法,传递你想要选择的选项。 希望对你有效。如果你可以使用一个,你不应该找到 3 个不同的 xpath。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 2019-10-11
      • 1970-01-01
      • 2010-11-26
      相关资源
      最近更新 更多