京东商城自动签到领京豆

一.介绍

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

 

二.登录流程

1.切换登录方式

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

2.输入用户名密码并登录

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

3.用户签到

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

4.店内签到

打开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')
posted @ 2017-11-10 17:41  faramita2016  阅读(10383)  评论(4编辑  收藏  举报