Отправьте значения из Excel в поля ввода на веб-странице с помощью selenium / python и openpyxl - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть следующий код:

from selenium import webdriver
import sys
import time
import os
import pyautogui
import webbrowser
import openpyxl
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from openpyxl import Workbook
from openpyxl import load_workbook

chrome_path =r"C:\Users\Desktop\webdriver\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)
driver.get("url string")


def login(driver):

    elem = driver.find_element_by_xpath("""//*[@id="usernameField"]""")
    elem.send_keys("username")
    elem2 = driver.find_element_by_xpath("""//*[@id="passwordField"]""")
    elem2.send_keys("password")
    driver.find_element_by_xpath("""//*        [@id="loginForm"]/table/tbody/tr[4]/td[2]/input""").click()
    driver.find_element_by_xpath("""//*[@id="nav"]/ul/li[2]/a""").click()
    driver.find_element_by_xpath("""//*[@id="check1"]""").click()

def sendvalues(driver):

    wb = load_workbook('prueba.xlsx')
    coma = ","
    ws = wb.active
    buscar = driver.find_element_by_xpath(""" //*[@id="wrapper"]/form/div[2]/input[1]""")
    rut = driver.find_element_by_xpath("""//*[@id="rut"]""")
    dv = driver.find_element_by_xpath("""//*[@id="wrapper"]/form/table[1]/tbody/tr[3]/td[2]/input""")
    nombre = driver.find_element_by_xpath("""//*[@id="wrapper"]/form/table[1]/tbody/tr[4]/td[2]/input""")


    rutvalue = ws.cell(1,1).value
    dvvalue = ws.cell(1,2).value
    nombrevalue = ws.cell(1,3).value


    rut.send_keys(rutvalue)
    dv.send_keys(dvvalue)
    nombre.send_keys(nombrevalue)
    buscar.click()  
    table_elements = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//table[@class = 'grilla']")))
    for table_element in table_elements:
        for row in table_element.find_elements_by_xpath(".//tr"):
            text_file = open("Output2.txt", "a")
            text_file.write(str(rutvalue)+str(coma)+str(row.text)+'\n')
            text_file.close()

    clear(driver)

def clear(driver):

    rut = driver.find_element_by_xpath("""//*[@id="rut"]""")
    dv = driver.find_element_by_xpath("""//*[@id="wrapper"]/form/table[1]/tbody/tr[3]/td[2]/input""")
    nombre = driver.find_element_by_xpath("""//*[@id="wrapper"]/form/table[1]/tbody/tr[4]/td[2]/input""")
    rut.clear()
    dv.clear()
    nombre.clear()

login(driver)
sendvalues(driver)

Код извлекает таблицу после отправки значений отдельных строк файла Excel на веб-сайт. У меня есть три столбца rutvalue, dvvalue и nombrevalue в файле .xlsx, и мне нужно отправить эти значения для каждой строки в указанные поля ввода c (rut value, dv value, name value) на веб-странице и получите таблицу результатов. Мне нужно отправить значения каждой строки Excel в поля ввода.

Существует ли метод для разработки цикла, повторяющего каждую строку и получающего результаты?

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Вы можете создать класс для кода очистки, а в другом файле прочитать файл xlsx и вызывать класс в каждой итерации. Посмотрите этот пример.

class ScrapingCode():
   def __init__(self, rut, dv, name):
       self.rut = rut
       self.dv = dv
       self.name = name

  def run(self):
      #for use the values here, use self.name_var
      rut.send_keys(self.rut)  
      ...code scraping...

** другой файл

from app.folder.file import ScrapingCode
# read csv
for row in rows:
    scrapingCode = ScrapingCode(row[0], row[1], row[2])
    scrapingCode.run()
0 голосов
/ 05 февраля 2020

я изменил и улучшил код с удовлетворительными результатами:

from selenium import webdriver
import sys
import time
import os
import pyautogui
import webbrowser
import openpyxl
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from openpyxl import Workbook
from openpyxl import load_workbook

chrome_path =r"C:\Users\Desktop\webdriver\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)
driver.get("myurl")


def login(driver):


    elem = driver.find_element_by_xpath("""//*[@id="usernameField"]""")
    elem.send_keys("myusername")
    elem2 = driver.find_element_by_xpath("""//*[@id="passwordField"]""")
    elem2.send_keys("mypassword")
    driver.find_element_by_xpath("""//*[@id="loginForm"]/table/tbody/tr[4]/td[2]/input""").click()
    driver.find_element_by_xpath("""//*[@id="nav"]/ul/li[2]/a""").click()
    driver.find_element_by_xpath("""//*[@id="check1"]""").click()

def sendvalues(driver):

    wb = load_workbook('prueba.xlsx')
    ws = wb.active
    buscar = driver.find_element_by_xpath(""" //*[@id="wrapper"]/form/div[2]/input[1]""")
    rut = driver.find_element_by_xpath("""//*[@id="rut"]""")
    dv = driver.find_element_by_xpath("""//*[@id="wrapper"]/form/table[1]/tbody/tr[3]/td[2]/input""")
    nombre = driver.find_element_by_xpath("""//*[@id="wrapper"]/form/table[1]/tbody/tr[4]/td[2]/input""")
    rutvalue=  ws.cell(row=x, column=1).value
    dvvalue= ws.cell(row=x, column=2).value
    nombrevalue= ws.cell(row=x, column=3).value
    rut.send_keys(rutvalue)
    dv.send_keys(dvvalue)
    nombre.send_keys(nombrevalue)
    buscar.click()
    table(driver)

def table(driver):
    rut = driver.find_element_by_xpath("""//*[@id="rut"]""")
    dv = driver.find_element_by_xpath("""//*[@id="wrapper"]/form/table[1]/tbody/tr[3]/td[2]/input""")
    nombre = driver.find_element_by_xpath("""//*[@id="wrapper"]/form/table[1]/tbody/tr[4]/td[2]/input""")
    coma = ","
    wb = load_workbook('prueba.xlsx')
    ws = wb.active
    rutvalue=  ws.cell(row=x, column=1).value
    table_elements = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//table[@class = 'grilla']")))

    for table_element in table_elements:
        for row in table_element.find_elements_by_xpath(".//tr"):
            text_file = open("Output2.txt", "a")
            text_file.write(str(rutvalue)+str(coma)+str(row.text)+'\n')
            text_file.close()
            rut.clear()
            dv.clear()
            nombre.clear()


login(driver)
for x in range(1,1000):
   sendvalues(driver)

Я определил «для l oop» в конце кода и определил в функции sendvalues ​​коэффициент x как видно в следующей части:

rutvalue=  ws.cell(row=x, column=1).value
dvvalue= ws.cell(row=x, column=2).value
nombrevalue= ws.cell(row=x, column=3).value

Спасибо за комментарии!

...