前言
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
作者:merlin&
前几天下载了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(';)
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 (5)
在我们点击登录之后,可能会出现一个滑块验证的环节,此环节可以用机器学习的方法自动通过验证,但是由于现在只是熟悉webdriver操作,可使用手动操作通过验证。
即在点击<登录>之后,添加延时 (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.(handle) #设置延时 (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): (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(';) 11 12 class pay: 13 #登录模块 14 def login_in(self,num,pwd): 15 driver.find_element_by_link_text('你好,请登录').click() 16 (1) 17 driver.find_element_by_link_text('账户登录').click() 18 (1) 19 driver.find_element_by_id('loginname').send_keys(num) 20 driver.find_element_by_id('nloginpwd').send_keys(pwd) 21 (1) 22 driver.find_element_by_id('loginsubmit').click() 23 (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.(handle) 30 (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 (num,pwd) 37 38 39 if __name__ == '__main__': 40 jd = pay() 41 jd.run_driver(name, password)
此段代码只到结算步骤,只供熟悉webdriver操作使用