京东商城自动签到领京豆

一.介绍

PhantomJS是一个基于WebKit的JavaScript API,它使用QtWebKit做为它核心浏览器的功能,使用WebKit来编译解释执行JavaScript代码,任何你能够在基于WebKit浏览器作的事情,它都能作到。Selenium是一个用于Web应用自动化程序测试的工具,可让浏览器自动加载页面,获取须要的数据,Selenium本身不带浏览器,因此须要和PhantomJS、FireFox、Chrome等浏览器结合css

 

二.登陆流程

1.切换登陆方式html

查找claaa=div.login-tab.login-tab-r的元素,发送click事件,class标签在selenium中须要使用"元素类型.class1.class2"把空格进行替换。python

2.输入用户名密码并登陆linux

查找id=loginname的元素,调用send_keys输入用户名;查找id=nloginpwd的元素,调用send_keys输入密码;查找id=loginsubmit的元素,发送click事件。web

3.用户签到浏览器

打开http://vip.jd.com/home.html页面,查找id=signIn的元素,发送click事件。并发

4.店内签到app

打开https://bean.jd.com/myJingBean/list页面,使用xpath查找//ul[@class='bean-shop-list']/li/a[@class='s-btn']元素,查找href属性,并打开页面;在新打开的页面中查找class=a.d-header-icon.unsigned的元素,并发送click事件。工具

 

三.完整代码

新建jd.py文件测试

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from selenium import webdriver
import time
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

# 点击页面元素
def my_click(browser, type, value):
    if type == "id":
        element = browser.find_element_by_id(value)
    elif type == "name":
        element = browser.find_element_by_name(value)
    elif type == "class":
        element = browser.find_element_by_css_selector(value)
    else:
        print("Can't find element")
        return
    element.click()
    time.sleep(3)

# 用户签到
def my_login(browser):
    browser.get("https://passport.jd.com/uc/login")
    time.sleep(3)
    my_click(browser, "class", "div.login-tab.login-tab-r")

    loginname = browser.find_element_by_id("loginname")
    nloginpwd = browser.find_element_by_id("nloginpwd")
    loginname.send_keys("username")
    nloginpwd.send_keys("password")

    my_click(browser, "id", "loginsubmit")
    print("login success")
    time.sleep(3)

    # 把页面保存为图片,验证是否登陆成功
    browser.get_screenshot_as_file("login.png")

# 店内签到
def shop_sign_in(browser):
    print("店内签到")
    browser.get("https://bean.jd.com/myJingBean/list")
    time.sleep(3)
    shops = browser.find_elements_by_xpath("//ul[@class='bean-shop-list']/li/a[@class='s-btn']")
    urls = [s.get_attribute("href") for s in shops]
    for url in urls:
        try:
            browser.get(url)
            time.sleep(3)
            my_click(browser, "class", "a.d-header-icon.unsigned")
            print("%s 签到成功" % url)
        except:
            print("%s 签到失败" % url)

# 用户登陆
def user_sign_in(driver):
    print("用户签到")
    url = "http://vip.jd.com/home.html"
    driver.get(url)
    time.sleep(3)
    my_click(driver, "id", "signIn")
    print("%s 签到成功" % url)

def main():
    browser = webdriver.PhantomJS(executable_path=r"/root/phantomjs-2.1.1-linux-x86_64/bin/phantomjs")
    # 最大化浏览器窗口
    browser.maximize_window()

    my_login(browser)
    user_sign_in(browser)
    shop_sign_in(browser)

    browser.quit()

if __name__ == "__main__":
    main()

 

四.验证程序

环境:Python(3.5.2)

1.下载Phantomjs

地址http://phantomjs.org/download.html

2.运行脚本

root@710bd3e4deb6:~# python3 jd.py 

3.登陆https://bean.jd.com/myJingBean/list查看是否签到成功

 

五.异常处理

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

输出字符编码格式错误,修改编码格式

import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
相关文章
相关标签/搜索