有没有更好的方法使用Selenium Python下载csv文件?

时间:2019-08-08 07:33:03

标签: parsing selenium-webdriver xpath python-3.7

我正在与在线站点进行交互,以获取脱机过滤的数据集。我正在使用Selenium Webdriver将值输入到javascript日期选择器表单中,提交表单并下载csv文件。通过我的测试,我遇到了间歇性问题,来自webdriver的错误提示:“无法通过xpath定位元素,元素不​​存在”。当我使用调试器时,它的工作时间大约是一半,但是当我运行该程序时,它似乎试图在可用之前抢到它。我可以检查源代码,发现该元素可用,但是Webdriver似乎找不到它。

我创建了一个循环,等待3秒再尝试一次,而我只让它运行大约15秒,然后它超时并杀死了该程序。我之前输入了一个计数器,以查看程序是否循环了正确的时间。有时,它会在第一次迭代时终止程序执行。最后几个测试似乎运行良好,但是我想知道是否有更好的方法来完成相同的任务?

这是引起问题的功能。在for循环中,download = driver.find_element_by_xpath('//*[@id=\"pagination-element-top\"]/div/div[1]/a')似乎抛出错误,但仅在某些情况下。

def search_dates(url, date):

    options = webdriver.ChromeOptions()
    prefs = {"download.default_directory": os.getcwd()}
    options.add_experimental_option("prefs", prefs)
    driver = webdriver.Chrome(options=options)
    driver.get(url)
    date_selector = driver.find_element_by_class_name("date-range-container ")
    start_date = date_selector.find_element_by_id("startDateId")
    if datetime.now().year == 2019:
        start_date.send_keys("1//1/2019")
    else:
        start_date.send_keys("1/1/" + str(datetime.now().year))
    end_date = date_selector.find_element_by_id("endDateId")
    end_date.send_keys(date)
    button = driver.find_element_by_class_name("msl-button.msl-button-green")
    button.send_keys(Keys.ENTER)
    csv_fn = ''
    for i in range(5):
        time.sleep(3)
        download = driver.find_element_by_xpath('//*[@id=\"pagination-element-top\"]/div/div[1]/a')
        download.send_keys(Keys.ENTER)
        # Gets the name of the csv file
        csv_fn = download.get_attribute("download")
        try:
            if os.path.exists(csv_fn):
                driver.close()
                break
            else:
                continue
        except Exception as e:
            print(str(e))
            sys.exit(0)
    return csv_fn

这是我解析csv文件的功能。我正在使用python pandas将csv文件解析为DataFrame。

def process_csv(csv_file):
    csv_dict = {}
    if os.path.exists(csv_file):
        try:
            with open(csv_file, 'r') as f:
                numbers = pd.read_csv(f, delimiter=',')
                for i, row in numbers.iterrows():
                    if (datetime.strptime(row['Draw Date'], '%m/%d/%Y').strftime('%A')) == 'Saturday':
                        csv_dict[row['Draw Date']] = row['Winning Numbers'].replace(',', '')
                    else:
                        pass
        except IOError as e:
            print("I/O error({0}): {1}".format(e.errno, e.strerror))
        except Exception as e:
            print(str(e))
    return csv_dict

目的是在网络表单中输入开始日期和结束日期,按提交按钮,然后按下载按钮将csv文件下载到当前工作目录中。下载csv后,我将解析数据以使其与运行测试所需的日期保持一致。

使用xpath来获取我要找的东西是最好的方法吗?我尝试使用element_by_name和element_by_class_name,但是似乎没有用。使用python请求会更容易还是更好?我希望创建一个可执行文件,并希望就此是否正确或请求是否可以解决我遇到的一些问题提出意见。

谢谢!

0 个答案:

没有答案