如何使用 selenium python 遍历 table 中的所有 tr 元素

How to traverse all the tr elements with in the table using selenium python

如何遍历所有 tr 以在 td.In 我的代码中给出值,它覆盖相同 tr/td。

我的table.

#qty to add
<tbody id="gridview-1161-body">
<tr id="gridview-1161-record-19842148" data-boundview="gridview-1161" class="x-grid-row x-grid-data-row" tabindex="-1">
<td role="gridcell" class="x-grid-cell x-grid-td x-grid-cell-headerId-gridcolumn-1158  rp-grid-editable-cell  rp-grid-editable-cell" id="ext-gen2535">
<div class="x-grid-cell-inner " style="text-align:right;">
<div class="rp-invalid-cell rp-icon-alert-require-field">
</div>
<input id="numberfield-1243-inputEl" type="text" role="spinbutton" name="Quantity" class="x-form-field x-form-text x-form-focus x-field-form-focus x-field-default-form-focus" autocomplete="off" style="width: 100%;"> 
</div></td>
</tr>

same like 
<tr>..</tr></tbody>

这里所有的id都是通过代码动态生成的。 我的 python 代码:

#add qty
    rowCount=len(driver.find_elements_by_xpath("//tbody[@id='gridview-1161-body']/tr"));
    print(rowCount)
    for row in rowCount:
        element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "td.x-grid-cell.x-grid-td.rp-grid-editable-cell[role='gridcell']")))
        element.click()
        time.sleep(2)

        #input box to give qty-working for this id
        driver.find_element(By.ID, "numberfield-1243-inputEl").send_keys('10')
        driver.find_element(By.ID, "numberfield-1243-inputEl").send_keys(Keys.ENTER)

由于动态 ID,我无法提供 find_element(By.ID)所以我使用 CSS_SELECTOR 来查找 td,但它覆盖了相同的 td..如何给 tr.next 遍历 table 中的所有 tr ?

获取所有行,然后找到child tdinput:

wait = WebDriverWait(driver, 20)

rows = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "tr[id*='-record-'].x-grid-data-row")))
for row in rows:
    row.find_element_by_css_selector("td[role='gridcell']").click()
    row.find_element_by_name("Quantity").send_keys("10", Keys.ENTER)

使用 xpath 和索引的第二种方式:

wait = WebDriverWait(driver, 10)
row_locator = "(//tr[contains(@id,'-record-')])"
rows_len = len(wait.until(EC.presence_of_all_elements_located((By.XPATH, row_locator))))
for i in range(1, rows_len + 1):
    wait.until(EC.element_to_be_clickable((By.XPATH, f"{row_locator}[{i}]/td[@role='gridcell']"))).click()
    driver.find_element_by_xpath(f"{row_locator}[{i}]/input[@name='Quantity']").send_keys("10", Keys.ENTER)

处理动态 ID Induce WebDriverWait()visibility_of_all_elements_located() 和以下 XPATH 选项。

driver=webdriver.Chrome()
rows=WebDriverWait(driver,15).until(EC.visibility_of_all_elements_located((By.XPATH,"//tbody[contains(@id,'-body')]//tr[@class='x-grid-row x-grid-data-row']")))
for rownum in range(len(rows)):

     #To avoid stale exception re-assign rows elements again
     rows = WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, "//tbody[contains(@id,'-body')]//tr[@class='x-grid-row x-grid-data-row']")))
     element=rows[rownum].find_element_by_xpath(".//td[contains(@class,'rp-grid-editable-cell  rp-grid-editable-cell') and @role='gridcell']")
     element.click()
     input=rows[rownum].find_element_by_xpath(".//input[@name='Quantity' and @role='spinbutton']")
     input.send_keys('10')
     input.send_keys(Keys.ENTER) 

要遍历祖先<tr>标签中的所有子<input>标签发送字符序列需要引入WebDriverWait 用于 visibility_of_all_elements_located(),您可以使用以下

for element in WebDriverWait(driver, 30).until(EC.visibility_of_all_elements_located((By.XPATH, "//tbody[starts-with(@id, 'gridview') and contains(@id, '-body')]/tr/td//input[@name='Quantity' and starts-with(@id, 'numberfield-')]"))):
    element.send_keys('10')
    element.send_keys(Keys.ENTER)