【问题标题】:Unable to click a link in a table无法单击表格中的链接
【发布时间】:2018-04-21 21:17:30
【问题描述】:

这是我的代码(在 Python 中):

driver=webdriver.Chrome('/Users/Documents/chromedriver')
driver.get('http://comprasnet.gov.br/acesso.asp?url=/livre/Pregao/ata0.asp')

#FIRST PAGE
driver.switch_to.frame('main2')
driver.find_element_by_name('dt_ini_sessao').send_keys('18/04/2018')
driver.find_element_by_name('dt_fim_sessao').send_keys('18/04/2018')
driver.find_element_by_name('ok').click()

直到这里没问题,代码运行顺利。但是,当我到达第二页时,我无法点击我想要的链接。

#SECOND PAGE
driver.find_element_by_xpath('//html/body/table[1]/tbody/tr/td[2]/table[2]/tbody/tr[6]/td[1]/a').click()

有人可以帮忙吗?

【问题讨论】:

  • 为什么要特别点击那个链接?是根据编号、代码、名称还是?

标签: selenium web-crawler selenium-chromedriver


【解决方案1】:

如果你想遍历第二页第一行的所有链接,你可以使用下面的代码:

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

driver = webdriver.Chrome('/Users/Documents/chromedriver')
driver.get('http://comprasnet.gov.br/acesso.asp?url=/livre/Pregao/ata0.asp')

#FIRST PAGE
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element_by_name("main2")))
driver.find_element_by_name('dt_ini_sessao').send_keys('18/04/2018')
driver.find_element_by_name('dt_fim_sessao').send_keys('18/04/2018')
driver.find_element_by_name('ok').click()

#SECOND PAGE
links = [link.get_attribute("href") for link in WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//td[1]/a")))]

for link in links:
    driver.get(link)
    # Do something on each page

#SECOND PAGE
links_count = len(WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//td[1]/a"))))

for index in range(links_count):
    WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//td[1]/a")))[index].click()
    # Do something on each page
    driver.get('http://comprasnet.gov.br/acesso.asp?url=/livre/Pregao/ata0.asp')
    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element_by_name("main2")))
    driver.find_element_by_name('dt_ini_sessao').send_keys('18/04/2018')
    driver.find_element_by_name('dt_fim_sessao').send_keys('18/04/2018')
    driver.find_element_by_name('ok').click()

【讨论】:

  • 有没有办法使用click而不是get?那是因为如果我单击它会转到与使用 get 不同的页面。
  • 很好的建议,谢谢,现在我可以点击它了。在第三页中,我使用 WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//td/input[4]")))[index].click(),驱动程序。 back 工作正常,但是当我回来时,它不会在链接之间不断迭代。你知道那可能是什么吗?
  • 这是一个单页站点,似乎单击“返回浏览器”不会导致相同的(第二个)页面。您需要在循环中添加更多行
【解决方案2】:

您可以改用find_elements_by_tag_name。它将为您提供具有 .click 方法的标签 a 的填充列表。

以下是工作代码示例。

from selenium import webdriver

driver=webdriver.Chrome()
driver.get('http://comprasnet.gov.br/acesso.asp?url=/livre/Pregao/ata0.asp')

#FIRST PAGE
driver.switch_to.frame('main2')
driver.find_element_by_name('dt_ini_sessao').send_keys('18/04/2018')
driver.find_element_by_name('dt_fim_sessao').send_keys('18/04/2018')
driver.find_element_by_name('ok').click()
for elem in driver.find_elements_by_tag_name('a') :
    if elem.text == "3112017" :
        elem.click()

【讨论】:

  • 感谢@toheedNiaz。稍后我将要在表中的所有链接之间进行迭代。按照您的建议,我将被限制为“3112017”。你有更灵活的建议吗?
  • @abutremutante,你能用这个额外的要求更新你的问题吗?
猜你喜欢
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多