自动化上传数据(二)

接下来就要使用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()

这样我们的上传商品类就定义好了

posted @ 2016-06-17 10:30  goddessofpom  阅读(274)  评论(0编辑  收藏  举报