控制浏览器点击、输入,登录大众点评
环境:
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.1 获取登录按钮路径
本文使用find_element_by_xpath用来定位控件的位置,在打开的浏览器界面点击Shift+Ctrl+C,点击“你好,请登录“按钮选取元素
在浏览器下侧查看器,查看选中的按钮所对应的源码,右键选择复制xpath
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.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)
账号登录包括账户密码登录和账户验证码登录,首先尝试账号密码登录。
# 选择账号登录
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.1 检测失败警告
try:
#账号登录失败警告
alert = browser.find_element_by_xpath('/html/body/div/div[1]/div[2]/div[1]/div[3]/span')
except NoSuchElementException:
break
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_)
.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)
当前页面还处于登录模块的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()