使用python+selenium+Firefox登录大众点评

目标:

控制浏览器点击、输入,登录大众点评

环境:

python-3.5、selenium-3.12.0、Firefox-59.0.3(32位)、geckodriver-v0.20.1-win64

步骤:

1、打开浏览器

#打开浏览器
browser = webdriver.Firefox()
href = 'http://www.dianping.com/'
browser.get(href)
time.sleep(2)

2、点击登录

2.1 获取登录按钮路径

本文使用find_element_by_xpath用来定位控件的位置,在打开的浏览器界面点击Shift+Ctrl+C,点击“你好,请登录“按钮选取元素

使用python+selenium+Firefox登录大众点评_第1张图片

在浏览器下侧查看器,查看选中的按钮所对应的源码,右键选择复制xpath

使用python+selenium+Firefox登录大众点评_第2张图片

2.2 点击登录

将复制好xpath粘贴到代码中,控制浏览器选取登录按键,并点击。

#选取登录按钮
login_btn = browser.find_element_by_xpath('/html/body/div/div[1]/div[1]/div/div[2]/span[2]/a[1]')
#点击登录按钮
login_btn.click()
time.sleep(3)

3、选择账号登录

3.1 切换至登录模块

直接使用浏览器选择xpath复制的路径导致找不到该元素的错误,查找原因发现登录模块是使用iframe嵌入到主页面中的,所以需要先切换到登录iframe才能继续操作。


选取iframe元素,并切换。

#选取并切换至账户登录iframe。
iframe = browser.find_element_by_xpath('/html/body/div[3]/div/div/div/div/iframe')
browser.switch_to_frame(iframe)

3.2 选择账号登录

账号登录包括账户密码登录和账户验证码登录,首先尝试账号密码登录。

# 选择账号登录
icon_pc = browser.find_element_by_xpath('/html/body/div/div[2]/div[1]')
icon_pc.click()
time.sleep(2)
#选择账密登录
name_login = browser.find_element_by_xpath('//*[@id="tab-account"]')
name_login.click()
time.sleep(2)
# 选取用户名,密码元素
username = browser.find_element_by_xpath('//input[@id="account-textbox"]')
password = browser.find_element_by_xpath('//input[@id="password-textbox"]')
# 输入用户名,密码
username.clear()
username.send_keys(username_)
password.clear()
password.send_keys(password_)
# 提交登陆
sub_btn = browser.find_element_by_xpath('//button[@id="login-button-account"]')
sub_btn.click()
time.sleep(5)

4、手机验证码登录

如果账密登录失败,尝试手机验证码登录

4.1 检测失败警告

    try:
      	#账号登录失败警告
        alert = browser.find_element_by_xpath('/html/body/div/div[1]/div[2]/div[1]/div[3]/span')
    except NoSuchElementException:
        break

4.2 切换到手机验证码登录

    mobile_login = browser.find_element_by_xpath('//*[@id="tab-mobile"]')
    mobile_login.click()
    username = browser.find_element_by_xpath('//*[@id="mobile-number-textbox"]')
    username.clear()
    username.send_keys(username_)

4.3 获取验证码并登录

    #点击获取验证码
    get_code = browser.find_element_by_xpath('//*[@id="send-number-button"]')
    get_code.click()
    
    #输入验证码
    verify_code = browser.find_element_by_xpath('//*[@id="number-textbox"]')
    verify_code_ = input('verify_code > ')
    verify_code.clear()
    verify_code.send_keys(verify_code_)
   
    # 提交登陆
    sub_btn = browser.find_element_by_xpath('//*[@id="login-button-mobile"]')
    sub_btn.click()
    time.sleep(5)

5、返回主页面

当前页面还处于登录模块的iframe,想进行下一步操作需要切换回整个页面。

#切换回主页
browser.switch_to_default_content()

有待改进:

1、不能识别验证码,需手动输入

2、xpath使用绝对路径,不稳健,可以考虑修改网页元素查找方式。

3、代理如何使用

4、使用cookie登录

完整代码:github

# -*- coding: utf-8 -*-
"""
Created on Sat May 12 12:57:22 2018

@author: wmq

请使用自己的账号、密码
"""

import time
import logging
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

#设置用户名密码
username_  = "********"
password_  = "********"

#设置日志等级
logging.basicConfig(level=logging.INFO)

#打开浏览器
browser = webdriver.Firefox()
href = 'http://www.dianping.com/'
browser.get(href)
time.sleep(2)

# 右上登陆
login_btn = browser.find_element_by_xpath('/html/body/div/div[1]/div[1]/div/div[2]/span[2]/a[1]')
login_btn.click()
time.sleep(3)

# 选择账号登录
iframe = browser.find_element_by_xpath('/html/body/div[3]/div/div/div/div/iframe')
browser.switch_to_frame(iframe)   #切换至登录模块iframe

#选择账号密码登录
icon_pc = browser.find_element_by_xpath('/html/body/div/div[2]/div[1]')
icon_pc.click()
time.sleep(2)
name_login = browser.find_element_by_xpath('//*[@id="tab-account"]')
name_login.click()
time.sleep(2)

# 输入用户名,密码
username = browser.find_element_by_xpath('//input[@id="account-textbox"]')
password = browser.find_element_by_xpath('//input[@id="password-textbox"]')
username.clear()
username.send_keys(username_)
password.clear()
password.send_keys(password_)

    
# 提交登陆
sub_btn = browser.find_element_by_xpath('//button[@id="login-button-account"]')
sub_btn.click()
time.sleep(5)


while True:
    #检测是否有登录失败警告
    try:
        alert = browser.find_element_by_xpath('/html/body/div/div[1]/div[2]/div[1]/div[3]/span')
    except NoSuchElementException:
        break
    
    if alert:
        #账密登录失败,尝试手机验证码登录
        mobile_login = browser.find_element_by_xpath('//*[@id="tab-mobile"]')
        mobile_login.click()
        username = browser.find_element_by_xpath('//*[@id="mobile-number-textbox"]')
        username.clear()
        username.send_keys(username_)
        
        #点击获取验证码
        get_code = browser.find_element_by_xpath('//*[@id="send-number-button"]')
        get_code.click()
        
        #输入验证码
        verify_code = browser.find_element_by_xpath('//*[@id="number-textbox"]')
        verify_code_ = input('verify_code > ')
        verify_code.clear()
        verify_code.send_keys(verify_code_)
        
        # 提交登陆
        sub_btn = browser.find_element_by_xpath('//*[@id="login-button-mobile"]')
        sub_btn.click()
        time.sleep(5)
        break
    else:
        raise Exception("Mobile login failed!")
               
#切换回主页
browser.switch_to_default_content()

你可能感兴趣的:(使用python+selenium+Firefox登录大众点评)