python selenium 登陆CSDN

初入selenium,想着经常使用CSDN写东西,就来写一个模拟登录CSDN的,完全没有想像的顺利;

先来说一下整个selenium的思路以及在整个写的过程中需要注意的点:

  1. 如果设定了窗口的大小,需要确定当前查找的元素能不能在有限的画幅中显示出来,如果窗口过小,会导致失败,可以选择最大化:
  2. 在页面跳转时,需要更新到新的页面,此时需要进行处理,详见代码的for 循环;
  3. 当页面没有跳转时,但是页面发生了变化,则需要进行等待(显式等待或者隐式等待均可,但是前者会更智能一些,有种轮询的感觉):

python selenium 登陆CSDN_第1张图片   页面1,页面2,python selenium 登陆CSDN_第2张图片

点击“账号登录之后”,根据id='all'在当前页面寻找时,并找到这个id,而是需要在更新之后的页面寻找ID,在这里弄了很久才解决,因为前端知识的薄弱,很是尴尬;

from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Chrome()
driver.maximize_window()#窗口最大化
driver.get('https://www.csdn.net/')
sleep(1)

username ="*****"
passwd ="*********"

browser = driver.find_element_by_link_text('登录')
browser.click()

#跳转到新的窗口
f_win = driver.current_window_handle
handles = driver.window_handles

for win in handles:
    if win != f_win:
        driver.switch_to_window(win)
sleep(2)

login = driver.find_element_by_xpath("//div[@class='main-select']/ul/li[2]/a[text() ='账号登录']")
login.click()

3页面发生跳转
# driver.implicitly_wait(20)#隐士等待,使用本行也可行
WebDriverWait(driver, 10, 0.2).until(lambda i: i.find_element_by_id("all"))#主动,发现标签时,停止等待

driver.find_element_by_id("all").send_keys(username)
print(11111)
# driver.find_element_by_id("password").clear()
driver.find_element_by_id("password-number").send_keys(passwd)

login = driver.find_element_by_xpath("//button[@class='btn btn-primary']")
login.click()
sleep(2)

driver.quit()

 

driver.find_element_by_xpath("//div[@class='main-select']/ul/li[2]/a[text() ='账号登录']")

代码解读:

首先来看一下前端代码的结构:

python selenium 登陆CSDN_第3张图片

前端基础比较薄弱,按照我自己理解的地方来分析代码:按照DOM树,依次查看有几层

首先是标签的顺序是:div-ul-li-a:其中div下仅有一个ul,li列表中有多个元素,但是我们使用是账号登录,是第二个因此代码是li[2],随后就a标签的文本内容;

这之间是一个层层过滤的过程,并过滤出来了具体的兄弟元素li[2],

xpath的结构简介如下:

  1.  /(绝对路径,从根节点选取) 
  2. //(相对路径,所有子代节点,不用考虑是否直接子节点) 
  3. @ 选取属性 
  4.  “.”选取当前节点 
  5. “..”选取当前节点的父节点;

如果想深入学习,可以学习这篇博客内容https://www.cnblogs.com/nancyzhu/p/8947339.html

你可能感兴趣的:(python)