3 使用selenium模拟登录csdn

摘要:
2模拟登录_Post表单方式使用selenium的好处是,能够直接模拟浏览器进行操作,然后填入用户名和密码,在登录成功以后,再把cookie保存下来。但是selenium有一个大问题,就是无法定位页面元素或者定位了以后无法与页面进行交互。使用selenium模拟登录csdn的代码#-*-coding:utf-8-*-"""CreatedonFriJul1316:13:522018@author:a"""fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.support.waitimportWebDriverWaitimporttimechrome_options=webdriver.ChromeOptions()chrome_options.add_argument#无界面模式#下面的代码是错误的使用方式#browser=webdriver.Chrome#下面的代码是使用无界面模式#browser=webdriver.Chromebrowser=webdriver.Chrome()printurl="https://passport.csdn.net/account/login"try:browser.gettarget=browser.find_element_by_xpathprinttarget.click()locator=WebDriverWait.untilusername=browser.find_element_by_idprinttime.sleepusername.clear()username.send_keyspassword=browser.find_element_by_idprintpassword.clear()password.send_keyssubmit=browser.find_element_by_xpathprintsubmit.click()exceptExceptionase:printfinally:printNone#browser.close()必须按照Python3网络爬虫实战开发中安装好chrome浏览器对应的chromedriver。

之前通过F12开发者模式调试,获取网站后台服务器验证用户名和密码的URL之后,再构造post数据的方式会存在一个问题,就是对目标网站的验证机制不明确,构造post数据除了用户名和密码之外,还可能有更复杂的协议。比如csdn的fkid机制,见上一篇博文。

2 模拟登录_Post表单方式(针对chinaunix有效,针对csdn失效,并说明原因)

使用selenium的好处是,能够直接模拟浏览器进行操作,然后填入用户名和密码,在登录成功以后,再把cookie保存下来。比之前的方式

urllib.request.Request(url,postdata)

好的太多。但是selenium有一个大问题,就是无法定位页面元素或者定位了以后无法与页面进行交互。笔者通过实战,总结出了两大杀器

  • WebDriverWait能够定位元素
  • 上一步能够定位元素以后,但是页面可能还属于不能交互的状态。这时再time.sleep(3)

就这样问题解决了。

使用selenium模拟登录csdn的代码
# -*- coding: utf-8 -*-
"""
Created on Fri Jul 13 16:13:52 2018

@author: a
"""

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time


chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')#无界面模式
#下面的代码是错误的使用方式
#browser = webdriver.Chrome(chrome_options=chrome_options,executable_path = "C:Program Files (x86)GoogleChromeApplicationchrome.exe")
#下面的代码是使用无界面模式
#browser = webdriver.Chrome(chrome_options=chrome_options)
browser = webdriver.Chrome()
print("xiaojie")
url="https://passport.csdn.net/account/login"
try:
    browser.get(url)
    target=browser.find_element_by_xpath('/html/body/div[3]/div/div/div[2]/div/h3/a')
    print("target:",target)
    target.click()

    locator=(By.ID,'username')
    WebDriverWait(browser, 20, 0.5).until(EC.presence_of_element_located(locator))    
    username=browser.find_element_by_id('username')
    print ("username:",username)
    time.sleep(3)
    username.clear()
    username.send_keys('183247166@qq.com')
    
    
    password=browser.find_element_by_id('password')
    print ("password:",password)
    password.clear()
    password.send_keys('XXXX')
    
    submit=browser.find_element_by_xpath('//*[@id="fm1"]/input[8]')
    print ("submit:",submit)
    submit.click()
except Exception as e:
    print (e)
finally:
    print("over")
    None
    #browser.close()
 

必须按照Python3网络爬虫实战开发中安装好chrome浏览器对应的chromedriver。

下面是全部实验过程(不感兴趣的可以忽略) 

3 使用selenium模拟登录csdn第1张

3 使用selenium模拟登录csdn第2张

可以看到,要先点击账户登录,待页面刷新以后,再输入用户名、密码,点击登录按钮。

在点击账户登录以后,页面刷新的过程如果比程序执行的过程慢,就会导致你使用spyder的调试模式,能够正常登录,但是直接运行总是报出的错误:

Message: invalid element state: Element is not currently interactable and may not be manipulated

参照网上一些人的做法,使用WebDriverWait以后,并且能够使用下面的语句定位出用户名的输入框:

username=browser.find_element_by_id('username')
print ("username:",username)

但是,执行下面:

username.clear()

还是会报错。这就说明,即使WebDriverWait定位到页面元素,也一时不能交互。于是添加上:

   time.sleep(3)

便解决了问题。

后续定位密码输入框以及登录按钮,并且产生交互,就不需要WebDriverWait和time.sleep了。因为用户名输入框和这两者是在一个页面。当用户名输入框定位和操作的问题解决了,后面的就自然也解决了。

免责声明:文章转载自《3 使用selenium模拟登录csdn》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇解决linux重启后无法开启nginx问题“var/run/nginx/nginx.pid" no such file or directory问题SQLServer数据库的死锁分析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

selenium之处理alert弹出对话框

在完成某些操作时会弹出对话框来提示,主要分为"警告消息框","确认消息框","提示消息对话"三种类型的对话框。    1.警告消息框(alert)  警告消息框提供了一个"确定"按钮让用户关闭该消息框,并且该消息框是模式对话框,也就是说用户必须先关闭该消息框然后才能继续进行操作。   2.确认消息框(confirm)   确认消息框向用户提示一个"是与否"...

[Selenium] Selenium WebDriver 的下载和安装

为配合较为广泛使用Java 语言的程序员,仅以WebDriver 的Java语言绑定进行讲解。 步骤1:下载并安装Java开发环境 1)在系统中安装JDK(Java开发工具吧,Java Development Kit) 注意: 这里安装的是JDK,而不是单纯的JRE(Java运行时环境,Java Runtime Environment) 2)由于Sun公司...

Selenium2+Python自动化-处理浏览器弹窗(转载)

本篇转自博客:上海-小T 原文地址:http://blog.csdn.net/real_tino/article/details/59068827 我们在浏览网页时经常会碰到各种花样的弹窗,在做UI自动化测试的时候势必要处理这些弹窗,这里就介绍一下目前前端界两种弹窗的处理方法。 一、alert弹窗这种弹窗是最简单的一种,Selenium里有自带的方法来处...

Selenium2+python自动化38-显式等待(WebDriverWait)

前言: 在脚本中加入太多的sleep后会影响脚本的执行速度,虽然implicitly_wait()这种方法隐式等待方法一定程度上节省了很多时间。 但是一旦页面上某些js无法加载出来(其实界面元素经出来了),左上角那个图标一直转圈,这时候会一直等待的。 一、参数解释 1.这里主要有三个参数: class WebDriverWait(object):drive...

一些使用JSP 编程技巧(转)

  1. 如何让选中的一行记录高亮显示?http://topic.csdn.net/t/20050105/09/3699823.html2. 如何在下拉列表框里选择一个值后跳出新窗口?http://topic.csdn.net/t/20050107/15/3707444.html3. 如何在JSP中启动execl?http://community.csd...

python自动化环境搭建

1 selenium环境搭建1.1seleniumselenium是测试web应用程序的框架,selenium为没有测试脚本的人提供了(seleniumide)提供了录制/回放的工具,同时它也提供了特定域的语言来编写测试脚本,如c#,java,python等,selenium可以针对最现代的web浏览器运行测试,如firefox,chrome,ie,ope...