自动化测试之淘宝下单


写在前面

最近猎头给我推荐了一份工作,有一道笔试题需要实现淘宝的自动登录、搜索、下单、付款。
提供了三个选项,UI自动化、接口自动化、移动自动化。
对我来说最简单有效的是使用selenium做UI自动化,接口自动化也可以写,但是登录可能就要一整天,移动自动化则是完全不会。

代码如下

#时间模块,用于delay以等待网页响应
import time
#从config中读取密码
import config
#加载selenium相关库
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
#配置chromedriver
chrome_options = Options()
#虚拟浏览器对象
browser = webdriver.Chrome(executable_path = 'chromedriver.exe',options = chrome_options)
#擦除浏览器指纹,如果不添加如下代码在登录的时候会一直出验证码
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
              "source": """
                Object.defineProperty(navigator, 'webdriver', {
                  get: () => undefined
                })
              """
            })
#访问登录页面
browser.get('https://login.taobao.com/member/login.jhtml')
time.sleep(1)
#获取用户名和密码框句柄
username = browser.find_element_by_name('fm-login-id')
password = browser.find_element_by_name('fm-login-password')
#传递用户名和密码
username.send_keys('username')
password.send_keys(config.taobaopassword)
time.sleep(5)
#尝试绕过滑动验证码,擦除浏览器指纹后滑动条不再出现
try:
    browser.switch_to.frame('baxia-dialog-content')
    time.sleep(1)
    dragElement = browser.find_element_by_id('nc_1__bg')
    ac2 = ActionChains(browser)
    ac2.drag_and_drop_by_offset(dragElement,258,0).perform()
except:
    pass
#点击登录按钮
browser.find_element_by_class_name("fm-btn").click()
time.sleep(1)
#访问淘宝首页
browser.get('https://www.taobao.com/?spm=a1z02.1.1581860521.1.XAddPD')
time.sleep(1)
#向搜索框传值
browser.find_element_by_id("q").send_keys("三只松鼠")
#点击搜索框
browser.find_element_by_class_name("search-button").click()
time.sleep(1)
#为了在同一窗口打开页面,首先获取商品的url
item = browser.find_element_by_xpath("//div[@class='items']//div[@data-index='0']//div//div//a")
#访问商品详情页
browser.get(item.get_attribute('href'))
time.sleep(1)
#点击“立即购买”
browser.find_element_by_class_name("tb-btn-buy tb-btn-sku").click()
time.sleep(1)
#选择商品类型
browser.find_element_by_xpath("//div[@class='tb-sku']//dl//dd//ul//li[@data-value='31560:11582287408']").click()
#点击确定
browser.find_element_by_id("J_LinkBuy").click()
time.sleep(1)
#提交订单
browser.find_element_by_xpath("//div[@class='submitOrder-container']//div").click()
time.sleep(1)
#支付密码,此处请务必小心,建议使用扫码付款
Paypasswd = browser.find_element_by_xpath("//div[@class='sixDigitPassword']")
Paypasswd.send_keys("password")
#点击确定,整个流程执行完毕
browser.find_element_by_xpath("//div[@class='ui-fm-item ui-fm-action j-submit']//input").click()
#退出模拟浏览器
browser.quit()

写在后面

正如面试官所问的一样,这段代码有很大的优化空间,可以将整个流程封装成类,类中写四个方法,分别负责登录、搜索、下单、付款。
更重要的问题是信息的安全,密码不应该以明文进行存储,我想到的方法是用户不登录,在下单页面使用扫码付款。