自动化上传数据(二)
接下来就要使用selenium进行浏览器操作了,写一个上传商品类:
from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.support.ui import WebDriverWait import time class UpProd: def __init__(self): self.driver = webdriver.Chrome()
这里self.driver表示使用的是chrome的浏览器插件
然后开始登录我们要上传的网址并自动输入账号密码:
def login(self, url, username, password): self.driver.get(url) #智能等待30秒,隐式的等待元素被发现或一个命令完成 self.driver.implicitly_wait(30) #输入账号密码 手动登录 self.driver.find_element_by_name('username').send_keys(username) self.driver.find_element_by_name('password').send_keys(password) time.sleep(15)
driver.get(url)表示浏览器进入的网址,driver.implicitly_wait(30)为等待30秒,直到找到要操作的元素,find_element_by_name是通过html标签中的name属性来找到相应的标签,send_keys方法给选中的元素输入相应的文字。
由于登录有图片验证码处理起来比较麻烦,但是我们上传数据只需要登录一次,所以采取简单的手动输入验证码的形式,这里使用time包的sleep方法暂停15秒给我们手动输入验证码并点击登录。
接下来找到上传商品的按钮点击进入上传页:
def display_list(self): self.driver.maximize_window() self.driver.find_element_by_xpath(r"/html/body/div[1]/div[2]/div[2]/ul/li[5]/a").click() #执行js,使左边不可见元素出现 self.driver.execute_script(first_js) time.sleep(5)
这里使用了find_element_by_xpath寻找元素,xpath可以通过在chrome浏览器控制台中右键相应元素copyXpath来获得,非常简单。maximize_window()方法为窗口最大化,主要方便我们观察。这里会遇到一个问题,这个按钮为不可见的元素,二selenium是无法操作不可见的元素的,那怎么办呢?好在selenium可以执行javascript,我们可以使用js将不可见元素显示出来,执行脚本的方法为execute_script(),顺便记录下js代码:
var leftMenuLi = document.getElementsByClassName('leftMenu_li'); var list = [] for(var i=0;i<leftMenuLi.length;i++){ if(leftMenuLi[i].getAttribute("rel") == 5){ list.push(leftMenuLi[i]) } } var clickdata = list[0] var sub = clickdata.getElementsByTagName("a") sub[0].click()
接下来开始写上传页的方法,将excel数据作为参数传进去然后操作相应元素,通过send_keys将每个数据填写到响应的输入框中,然后使用click()方法点击上传按钮:
def up_product(self, proname, scprice, sc_price, pfprice, sjprice, jsprice, point, ziti, soldout, views, know, detail, date, order, shop, imgpath)
这里主要注意几点,一个是窗口中有不同的frame的时候,需要使用switch_to_frame()方法跳到响应的frame,否则无法找到frame中的元素。操作frame完成后可以通过switch_to_default_content()返回主窗口。有些地方是单选框或者复选框,那么我们可以在数据中用数字表示是否选择,如0表示不选择,1表示选择。然后用一个if else语句判断是否点击单选或复选按钮。由于网络问题提交后可能需要等待,我们可以使用time包的sleep方法适当时机暂停脚本。
最后return True表示上传成功
接下来定义一个上传日志方法,记录我们的上传情况:
import datetime
引入datetime包记录时间
def create_log(self, filename, proname, status): if status == 1: f = open('C:\cspy\webtest\log' + filename,'w') f.write(u"成功上传" + proname + u"于" + datetime.datetime.now() + "\n") f.close() else: f = open('C:\cspy\webtest\log' + filename,'w') f.write(proname + u"上传失败" +"\n") f.close()
最后上传完成后,定义一个关闭浏览器方法:
def quit_window(self): self.driver.quit()
这样我们的上传商品类就定义好了