zoukankan      html  css  js  c++  java
  • 熟悉使用Webdriver ---- 商品自动秒杀

    前几天下载了Webdriver模块,经过简单的研究,发现这个模块可以做很多有意思的事情,下面我就用一个实例来理解webdriver的此处操作(完整代码在文章末尾)。

    *浏览器:谷歌chrome浏览器

    *预先安装模块:selenium模块,Webdriver(不会安装请看我的上一条博客)

    *编程语言:Python

    首先观察正常购物流程(以京东商城为例)

    打开京东网址(www.jd.com)→点击登录→选择账号密码登录→输入账号密码→打开购物车,选择想要购买的物品→点击去结算→付款购买

    1.首先导入第三方模块,指定webdriver位置

    1 from selenium import webdriver
    2 import time
    3 
    4 #将账号密码赋给变量name、password
    5 password = '京东密码'
    6 name = '京东账号'
    7 #指定webdriver位置
    8 driver = webdriver.Chrome('/home/chromedriver')

    2、打开京东网址

    driver.get('https://www.jd.com/')

    3.点击登录选项

    首先将鼠标移动至登录选项,右击检查

    发现可以根据文字内容定为到选项

     

    #点击登录选项
    driver.find_element_by_link_text('你好,请登录').click()

     4.进入登录界面,自动输入账号密码,登录账号

     右击检查,发现<账户登录>选项可以通过文本定位,<账号输入框><密码输入框>分别由name属性进行定位,<登录>使用ID进行定位

    1 #点击账户登录
    2 driver.find_element_by_link_text('账户登录').click()
    3 #输入账号密码
    4 driver.find_element_by_id('loginname').send_keys(num)
    5 driver.find_element_by_id('nloginpwd').send_keys(pwd)
    6 #点击登录键
    7 driver.find_element_by_id('loginsubmit').click()
    8 #延时5s
    9 time.sleep(5)

     在我们点击登录之后,可能会出现一个滑块验证的环节,此环节可以用机器学习的方法自动通过验证,但是由于现在只是熟悉webdriver操作,可使用手动操作通过验证。

    即在点击<登录>之后,添加延时 time.sleep(5) 并在5s之内通过滑块验证

    5.点击购物车,勾选想要购买的物品,点击付款

    购物车可以通过文本定位

    driver.find_element_by_link_text('我的购物车').click()

    然后要勾选要下单的物品,点击去结算

    勾选框我使用的是谷歌浏览器的xpath helper插件来进行定位,结算键可以同样使用文本来定位

    #使用xpath语法定位复选框
    driver.find_element_by_xpath("/html[@class=' jd_retina']/body/div[@id='container']/div[@class='cart-warp']/div[@class='w']/div[@id='jd-cart']/div[@class='cart-main cart-main-new']/div[@id='cart-list']/div[@id='cart-item-list-01']/div[@id='vender_8888']/div[@class='item-list']/div[@id='product_promo_50077743033']/div[@id='product_100008492922']/div[@class='item-form']/div[@class='cell p-checkbox']/div[@class='cart-checkbox']/input[@class='jdcheckbox']").click()
    #点击去结算
    driver.find_element_by_link_text('去结算').click()

     此时若直接使用之前的定位方法来勾选和结算,代码运行后会报错,这是因为点击我的购物车之后,打开了一个新的网页,但是代码执行的默认网页还是在www.jd.com

    所以程序找不到我们定位的位置,所以会提示错误

    该段的正确代码是

    #保存初始网页
    wnhandle = driver.current_window_handle
    #点击我的购物车
    driver.find_element_by_link_text('我的购物车').click()
    #保存打开的所有网页
    all_handle = driver.window_handles
    #遍历保存的网页
    for handle in all_handle:
            #判断当前打开的网页是否为初始网页
           if handle != wnhandle:
           #若为新打开的网页,则切换到新网页
               driver.switch_to.window(handle)
    #设置延时
    time.sleep(2)
    #勾选复选框
    driver.find_element_by_xpath("/html[@class=' jd_retina']/body/div[@id='container']/div[@class='cart-warp']/div[@class='w']/div[@id='jd-cart']/div[@class='cart-main cart-main-new']/div[@id='cart-list']/div[@id='cart-item-list-01']/div[@id='vender_8888']/div[@class='item-list']/div[@id='product_promo_50077743033']/div[@id='product_100008492922']/div[@class='item-form']/div[@class='cell p-checkbox']/div[@class='cart-checkbox']/input[@class='jdcheckbox']").click()
    #点击结算
    driver.find_element_by_link_text('去结算').click()

    6.封装函数 

     将以上函数封装到模块中,方便调用

    def login_in(self,num,pwd):

    7.定义模块调用

    def run_driver(self,num,pwd):
         self.login_in(num,pwd)

    完整代码 

     1 from selenium import webdriver
     2 import time
     3 
     4 name = '账号'
     5 password = '密码'
     6 
     7 #指定webdriver位置
     8 driver = webdriver.Chrome('/home/jmhao/chromedriver')
     9 #打开京东网址
    10 driver.get('https://www.jd.com/')
    11 
    12 class pay:
    13     #登录模块
    14     def login_in(self,num,pwd):
    15         driver.find_element_by_link_text('你好,请登录').click()
    16         time.sleep(1)
    17         driver.find_element_by_link_text('账户登录').click()
    18         time.sleep(1)
    19         driver.find_element_by_id('loginname').send_keys(num)
    20         driver.find_element_by_id('nloginpwd').send_keys(pwd)
    21         time.sleep(1)
    22         driver.find_element_by_id('loginsubmit').click()
    23         time.sleep(5)
    24         wnhandle = driver.current_window_handle
    25         driver.find_element_by_link_text('我的购物车').click()
    26         all_handle = driver.window_handles
    27         for handle in all_handle:
    28             if handle != wnhandle:
    29                 driver.switch_to.window(handle)
    30         time.sleep(2)
    31         driver.find_element_by_xpath("/html[@class=' jd_retina']/body/div[@id='container']/div[@class='cart-warp']/div[@class='w']/div[@id='jd-cart']/div[@class='cart-main cart-main-new']/div[@id='cart-list']/div[@id='cart-item-list-01']/div[@id='vender_8888']/div[@class='item-list']/div[@id='product_promo_50077743033']/div[@id='product_100008492922']/div[@class='item-form']/div[@class='cell p-checkbox']/div[@class='cart-checkbox']/input[@class='jdcheckbox']").click()
    32         driver.find_element_by_link_text('去结算').click()
    33 
    34     #运行
    35     def run_driver(self,num,pwd):
    36         self.login_in(num,pwd)
    37 
    38 
    39 if __name__ == '__main__':
    40     jd = pay()
    41     jd.run_driver(name, password)

    此段代码只到结算步骤,只供熟悉webdriver操作使用

  • 相关阅读:
    移除“xmlns”命名空间
    求质数几种算法
    删除重复字符串的算法
    第一章 搭建一个通用的.net core项目框架
    LSJ_NHibernate第四章 MVC
    LSJ_NHibernate第三章 IDAL,DAL,BLL
    LSJ_NHibernate第二章 ManagerPage
    LSJ_NHibernate第一章 NHibernate介绍
    SQL Server2008R无法登录的解决方案(系统文件损坏)1814 18456....不看别后悔,有用请点赞
    lsjORM ----让开发变得更加快捷(二)
  • 原文地址:https://www.cnblogs.com/cherish-hao/p/12568532.html
Copyright © 2011-2022 走看看