繁体   English   中英

我试图遍历列中的每个元素并单击它,但它给了我错误。 “找不到元素”

[英]I am trying to iterate on each element in column and click on it, but it gives me error. "can not locate the element"

请任何人帮助我处理这段代码:我正在尝试迭代列中的每个元素并单击它,但它给了我错误。 “找不到元素”,但是当我摆脱 for 循环并尝试一个元素时,它会起作用。

import csv

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome(executable_path="C:\Program Files (x86)\chromedriver.exe")




driver.get("http://www.dc.state.fl.us/OffenderSearch/list.aspx?TypeSearch=IR&Page=List&DataAction=Filter&dcnumber=&LastName=a&FirstName=&SearchAliases=1&OffenseCategory=&ZipCode=&ReleaseDateBeg=10%2f01%2f1997&ReleaseDateEnd=&CountyOfCommitment=&StatedCountyOfResidence=&ReleaseFacility=&photosonly=0&nophotos=1&matches=20")

driver.implicitly_wait(10)
for i in range(2,6):
    person = driver.find_element(By.XPATH, '//table[@id="ctl00_ContentPlaceHolder1_GrdReleasesPublic"]/tbody/tr[i]/td[1]/a').click()
    #person = driver.find_element(By.XPATH,"/html[1]/body[1]/div[5]/div[1]/div[1]/div[1]/form[1]/div[3]/div[1]/div[1]/div[3]/table[1]/tbody[1]/tr[row]/td[1]/a[1]").click()

    driver.implicitly_wait(5)

    # retriving info about the inmate
    person_info = driver.find_element(By.CLASS_NAME, "offenderDetails").text
    alias = driver.find_element(By.ID, "ctl00_ContentPlaceHolder1_divAlias").text
    al = alias.replace('\n', ' ')

    y = person_info + "\n" + al
    #print(y)
    person_info.strip(',')
    with open('readme.txt', 'w') as f:
         f.write(y)

    #print(person_info)
    myfile = open("readme.txt", "r")
    data_dic = {}
    for line in myfile:
        #print(line)
        k, v = line.strip('').split(":")
        data_dic[k.strip()] = v.strip()
    myfile.close()
    print(data_dic)

    header = ['DC Number', 'Name', 'Race', 'Sex', 'Birth Date', 'Custody', 'Release Date', 'Aliases' ]
    new_dic = [data_dic]
    print(new_dic)
    with open('test4.csv', 'w') as csvfile1:
        writer = csv.DictWriter(csvfile1, fieldnames=header)
        writer.writeheader()
        writer.writerows(new_dic)

    driver.get("http://www.dc.state.fl.us/OffenderSearch/list.aspx?TypeSearch=IR&Page=List&DataAction=Filter&dcnumber=&LastName=a&FirstName=&SearchAliases=1&OffenseCategory=&ZipCode=&ReleaseDateBeg=10%2f01%2f1997&ReleaseDateEnd=&CountyOfCommitment=&StatedCountyOfResidence=&ReleaseFacility=&photosonly=0&nophotos=1&matches=20")
    driver.implicitly_wait(10)

您无需单击表格上的每个链接,而是可以捕获列表中的所有href值,然后迭代并导航到每个页面。

代码:

driver.get("http://www.dc.state.fl.us/OffenderSearch/list.aspx?TypeSearch=IR&Page=List&DataAction=Filter&dcnumber=&LastName=a&FirstName=&SearchAliases=1&OffenseCategory=&ZipCode=&ReleaseDateBeg=10%2f01%2f1997&ReleaseDateEnd=&CountyOfCommitment=&StatedCountyOfResidence=&ReleaseFacility=&photosonly=0&nophotos=1&matches=20")

WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//table[@id='ctl00_ContentPlaceHolder1_GrdReleasesPublic']")))
#Get list of urls
urlList=[url.get_attribute('href') for url in driver.find_elements(By.XPATH,"//table[@id='ctl00_ContentPlaceHolder1_GrdReleasesPublic']//tbody//td[2]//a")]

for url in urlList:

   driver.get(url)
   #do what you wish

您需要导入以下库。

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

可以使用row作为参数构造xpath,获取每个元素的'href',然后new_tab打开页面,获取个人信息和别名。 使用 clicknium 做到这一点真的很容易和直接:

from clicknium import clicknium as cc

if not cc.chrome.extension.is_installed():
    cc.chrome.extension.install_or_update()
tab = cc.chrome.open("http://www.dc.state.fl.us/OffenderSearch/list.aspx?TypeSearch=IR&Page=List&DataAction=Filter&dcnumber=&LastName=a&FirstName=&SearchAliases=1&OffenseCategory=&ZipCode=&ReleaseDateBeg=10%2f01%2f1997&ReleaseDateEnd=&CountyOfCommitment=&StatedCountyOfResidence=&ReleaseFacility=&photosonly=0&nophotos=1&matches=20")

xpath_template = '//*[@id="ctl00_ContentPlaceHolder1_GrdReleasesPublic"]/tbody/tr[{}]/td[2]/a'
row = 2
while True:
    xpath = xpath_template.format(row)
    if tab.is_existing_by_xpath(xpath):
        href = tab.find_element_by_xpath(xpath).get_property('href')
        url = "http://www.dc.state.fl.us{}".format(href)
        new_tab = tab.browser.new_tab(url)
        person_info = new_tab.find_element_by_xpath('//table[@class="offenderDetails"]').get_text()
        alias = new_tab.find_element_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_divAlias"]').get_text()
        al = alias.replace('\n', ' ')
        print(person_info)
        print(al)
        new_tab.close()
        row = row + 1
    else:
        break

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM