【问题标题】:Using Python/Selenium to select checkboxes from an angular website使用 Python/Selenium 从 Angular 网站中选择复选框
【发布时间】:2018-12-06 15:04:21
【问题描述】:

Here's the angular source

尝试创建一个简单的脚本,用 python/selenium 选中/取消选中某些框。

我扔了一本小书,无法正确识别元​​素。我尝试过(可能不正确)css、xpath、标签、文本。

任何帮助将不胜感激。

代码试用:

driver.find_elements_by_class_name('list-group-items')[1].click()

HTML:

<div class="col-sm-12">
<fieldset>
  <legend>
    Step 2: Choose Data fields
  </legend>
  <div class="col-sm-5 col-lg-4">

    <div class="panel minimal minimal-gray">

      <div class="panel-title">
        <h4>
          Standard Fields:
        </h4>
      </div>

      <ul class="list-group scrollable ng-scope" id="standard-fields" ng-class="{error: ctrl.export.errors.columns}">
        <!-- ngRepeat: item in ctrl.exportFormats.columns track by item.code --><li ng-repeat="item in ctrl.exportFormats.columns track by item.code" class="list-group-item ng-binding ng-scope list-group-item-success" ng-class="{'list-group-item-success' : item.checked}">
          <input type="checkbox" ng-model="item.checked" class="ng-pristine ng-untouched ng-valid">
          &nbsp;&nbsp;Date
        </li><!-- end ngRepeat: item in ctrl.exportFormats.columns track by item.code --><li ng-repeat="item in ctrl.exportFormats.columns track by item.code" class="list-group-item ng-binding ng-scope list-group-item-success" ng-class="{'list-group-item-success' : item.checked}">
          <input type="checkbox" ng-model="item.checked" class="ng-pristine ng-untouched ng-valid">
          &nbsp;&nbsp;Time
        </li><!-- end ngRepeat: item in ctrl.exportFormats.columns track by item.code --><li ng-repeat="item in ctrl.exportFormats.columns track by item.code" class="list-group-item ng-binding ng-scope list-group-item-success" ng-class="{'list-group-item-success' : item.checked}">

【问题讨论】:

  • 请在问题中直接包含 HTML 源代码以及您的 Python 代码。这将帮助我们回答您的问题。
  • 当然。刚刚更新了。

标签: python angularjs selenium xpath webdriverwait


【解决方案1】:

看来你已经很接近了。根据您的代码试验而不是find_elements_by_class_name('list-group-items')[1],使用find_element_by_class_name('list-group-item') 会让您更接近。

但是,由于所需的元素是 Angular 元素,因此请单击与文本关联的 复选框,例如日期时间等,您必须诱导 WebDriverWait 才能使 元素可点击,您可以使用以下解决方案:

  • 日期

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//li[@class='list-group-item ng-binding ng-scope list-group-item-success' and contains(@ng-repeat,'exportFormats')][contains(.,'Date')]/input[@class='ng-pristine ng-untouched ng-valid']"))).click()
    
  • 时间

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//li[@class='list-group-item ng-binding ng-scope list-group-item-success' and contains(@ng-repeat,'exportFormats')][contains(.,'Time')]/input[@class='ng-pristine ng-untouched ng-valid']"))).click()
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

【讨论】:

  • 你是个圣人。这就像一个魅力,我绝对没有阅读任何建议 WebDriverWait 作为解决方案的文献。非常感谢。
  • 跟进:@DebanjanB 日期工作得很好。时间挂起大约 10 秒,然后出错。 line 80, in until raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message: 我尝试将 list-group-item ng-binding ng-scope list-group-item-success 更改为 list-group-item ng-binding ng-scope,因为这是我看到的唯一区别,但这给了我同样的错误。
  • 我已经交叉检查了您提供的 HTML。似乎&lt;li&gt; 都具有以下类list-group-item ng-binding ng-scope list-group-item-success。从这个角度来看,我们的解决方案一定奏效了。我很确定,一旦您在 Date 调用 click(),HTML DOM 就会发生变化。所以 XPath 也应该不同。您可以在此时交叉检查 HTML(Date 已单击但 Time 未单击)吗? Time &lt;input&gt; 的 HTML 是相同还是不同?
  • 谢谢@Debanjamb。这就是问题所在。 "//li[@class='list-group-item ng-binding ng-scope list-group-item-success' and "//li[@class='list-group-item ng-binding ng-scope' and contains`我以为我已经检查过了,再次检查后它起作用了。感谢您的帮助。
猜你喜欢
  • 2014-02-08
  • 2017-04-21
  • 1970-01-01
  • 2017-06-09
  • 2019-04-30
  • 2017-09-30
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多