【问题标题】:iterating over webelements in selenium always returns me only first row of the table在 selenium 中迭代 webelements 总是只返回表格的第一行
【发布时间】:2021-03-05 20:45:05
【问题描述】:

这是我的代码,首先我在 all_trows 变量中获取表的所有行,在迭代它时,我期望不同的输出,因为每一行都有不同的文本,但我总是得到第一个 tr 的值表。

url = 'https://www.un.org/Depts/ptd/eoi?field_commodity_group_eoi_rfi_tid=All&items_per_page=5'

driver.get(url)
driver.implicitly_wait(5)
WebDriverWait(driver,5).until(EC.visibility_of_element_located((By.XPATH,"//*[@id='block-system-main']/div/div[contains(@class,'view-content')] /table/tbody")))
WebDriverWait(driver,5).until(EC.visibility_of_element_located((By.XPATH,"//*[@id='block-system-main']/div/div[contains(@class,'view-footer')]/div[contains(@class,'page_result')]")))

page = 0
while True:
    time.sleep(5)
    driver.implicitly_wait(10)
    current_page_flag = driver.find_element(By.XPATH , "//*[@id='block-system-main']/div/div[@class ='view-footer'] / div[@class ='page_result']").text.strip()
    WebDriverWait(driver,2).until(EC.visibility_of_element_located((By.XPATH, "//*[@id='block-system-main']/div//tbody")))
    all_trows = driver.find_elements_by_xpath("//*[@id='block-system-main']/div/div[@class = 'view-content'] / table / tbody / tr")

    for eachRow in all_trows:
        op_link = eachRow.find_element_by_xpath('//td[position() = 1]/a').get_attribute('href').strip()
        print(op_link)
        
    try:
        WebDriverWait(driver,2).until(EC.visibility_of_element_located((By.XPATH, "//*[@id='block-system-main']/div/div[@class ='item-list']/ul/li")))
        driver.find_element_by_xpath("//*[@id='block-system-main']/div/div[@class = 'item-list']/ul/li[contains(@class, 'pager-next')]/a").click()
        driver.implicitly_wait(5)
        WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_xpath("//*[@id='block-system-main']/div/div[@class ='view-footer'] / div[@class ='page_result']").text.strip()!= current_page_flag)
        page = page + 1
        print(page)
    except NoSuchElementException:
        print('no next button')
        # driver.quit()
        break

这是我的输出

https://www.un.org/Depts/ptd/business-opportunities/EOI/eoiunmiss17882
https://www.un.org/Depts/ptd/business-opportunities/EOI/eoiunmiss17882
https://www.un.org/Depts/ptd/business-opportunities/EOI/eoiunmiss17882
https://www.un.org/Depts/ptd/business-opportunities/EOI/eoiunmiss17882
https://www.un.org/Depts/ptd/business-opportunities/EOI/eoiunmiss17882
1
https://www.un.org/Depts/ptd/business-opportunities/EOI/eoiunficyp17877
https://www.un.org/Depts/ptd/business-opportunities/EOI/eoiunficyp17877
https://www.un.org/Depts/ptd/business-opportunities/EOI/eoiunficyp17877
https://www.un.org/Depts/ptd/business-opportunities/EOI/eoiunficyp17877
https://www.un.org/Depts/ptd/business-opportunities/EOI/eoiunficyp17877
2
https://www.un.org/Depts/ptd/business-opportunities/EOI/eoiescwa17908
https://www.un.org/Depts/ptd/business-opportunities/EOI/eoiescwa17908
https://www.un.org/Depts/ptd/business-opportunities/EOI/eoiescwa17908
https://www.un.org/Depts/ptd/business-opportunities/EOI/eoiescwa17908
https://www.un.org/Depts/ptd/business-opportunities/EOI/eoiescwa17908

我希望在迭代不同的行时我必须得到不同的 href 值。

【问题讨论】:

    标签: python selenium selenium-webdriver


    【解决方案1】:

    你需要改变这一行

    op_link = eachRow.find_element_by_xpath('//td[position() = 1]/a').get_attribute('href').strip()

    当你迭代行时,它总是选择 DOM 树中的第一项。

    要从 DOM 树中为每一行选择直接子级,您需要使用 . 进行更改

    所以你的代码应该是

    for eachRow in all_trows:
            op_link = eachRow.find_element_by_xpath('.//td[position() = 1]/a').get_attribute('href').strip()
            print(op_link)
    

    【讨论】:

    • 您好,感谢您的回复。这对我帮助很大。我在控制台中继续收到一条消息,同时报废为 [1123/152232.645:INFO:CONSOLE(2435)]“未捕获的类型错误:无法设置属性 'oldValue' of null”,来源:etendering.ted.europa.eu/cft/cft-display.html?cftId=7529 (2435)
    • 你能告诉我这是什么意思如何处理它
    • 我想这是一个单独的问题,不附加在您的原始帖子中。如果您发布一个新问题并提及您遇到问题的位置以及您的预期,我将不胜感激。谢谢
    • 这只是一个我无法理解的警告,所以我把它放在这里。
    • @TalibDaryabi :我没有执行你的代码。但是,您在哪一行收到该警告?
    猜你喜欢
    • 2021-12-24
    • 2021-12-26
    • 2011-06-23
    • 2023-02-24
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多