无法选中复选框获取超时异常

时间:2019-07-15 08:17:47

标签: python selenium xpath css-selectors webdriverwait

我有以下html代码,我无法选中该复选框。

<table style="overflow:hidden;" cellpadding="0" cellspacing="0" border="0" role="presentation" class="table-header">
<tbody>
 <tr>
  <td class="cell-container cell-container-0 cell-selector locked xwtTable_1562932879200_0" role="presentation" columnidx="0" style="vertical-align: middle;width: 0px;" tabindex="0" aria-readonly="true">
    <div class="cell cell-0 ellipsis no-wrapping cell-selector ellipsis no-wrapping xwtTable_1562932879200_0" role="columnheader" style="text-align: center;" title="">
    <div tabindex="0" class="xwtSelectAll dijitCheckBox" "="" style="visibility:visible">
          <input type="checkbox" class="select-all" style="visibility:visible">
    </div>
 </div>
</td>
</tr>
</tbody></table>

我收到超时异常:

  

element = wait.until(EC.element_to_be_clickable((By.XPATH,   “ // div // input [@ class ='全选']”)))

错误[338.067268s]:test_login(主要 .TestHome)

回溯(最近通话最近):   在test_login中的文件“ TestHome.py”,第55行     s.filterclick()   文件“ C:/ Users / rakadali / PycharmProjects / CMM1 \ Pageobjects \ searchdevice.py”,第25行,在filterclick中     WebDriverWait(self.driver,20).until(EC.element_to_be_clickable((By.XPATH,“ // table [@ class ='table-header'] / tbody / tr / td // div [包含( @class,'dijitCheckBox')] / input [@ class ='select-all']“))))。click()   文件“ C:\ Program Files(x86)\ Python37-32 \ lib \ site-packages \ selenium \ webdriver \ support \ wait.py”,第80行,直到     引发TimeoutException(消息,屏幕,堆栈跟踪) selenium.common.exceptions.TimeoutException:消息:

下面是代码:

def filterclick(self):

    try:
        wait = WebDriverWait(self.driver, 80)
        element =wait.until(EC.element_to_be_clickable((By.XPATH, "//div//input[@class='select-all']")))
        element.click()
    finally:
        self.driver.close()

我要选中复选框

4 个答案:

答案 0 :(得分:0)

尝试遵循 settings = { edit: { editButtonContent: '<nb-icon icon="brush"></nb-icon>', saveButtonContent: '<nb-icon icon="checkmark"></nb-icon>', cancelButtonContent: '<nb-icon icon="close-circle"></nb-icon>' }, columns: { device: { title: 'Device', sortDirection: 'asc' }, type: { title: 'Type', sort: false, filter: false }, serialNumber: { title: 'Serial Number' }, status: { title: 'Status' } } }; 来单击复选框。

xpath

答案 1 :(得分:0)

要选择此复选框,您需要为所需的element_to_be_clickable()引入 WebDriverWait ,并且可以使用以下Locator Strategies

  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "table.table-header>tbody>tr>td div.dijitCheckBox>input.select-all"))).click()
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//table[@class='table-header']/tbody/tr/td//div[contains(@class, 'dijitCheckBox')]/input[@class='select-all']"))).click()
    
  • 注意:您必须添加以下导入:

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

答案 2 :(得分:0)

overlapped与另一个对象(即父项divparent的情况下,复选框可能无法点击的情况,请尝试删除显式等待并尝试直接单击复选框,例如:

driver.find_elements_by_xpath("input[@class='select-all']").click()

WebDriver应该报告错误,说明为什么无法单击元素,这将使您对获得点击的元素有深刻的了解。

您也可以尝试点击XPath Axes div,例如:

element =wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@class='select-all']/parent::div")))

查看XPath Operators & Functionsiframe文章,以了解有关构建复杂XPath定位器的更多信息

要考虑的其他事项:

答案 3 :(得分:0)

  

第25行,在filterclick中,单击WebDriverWait(self.driver,20).until(EC.element_to_be_clickable((By.XPATH,“ // table [@ class ='table-header'] / tbody / tr / td // div [contains(@class,'dijitCheckBox')] / input [@ class ='select-all']“))))。click()

似乎您使用的是绝对xpath,在执行时可能会更改它,因此此xpath不再显示复选框。例外非常清楚。它说:“我在等待此复选框达80秒钟,但它并未显示在UI上,现在我已经完成等待。” 只需确保该元素在给定时间内可在UI上使用,并且可以使用您提供的正确选择器进行搜索。