python selenium 登陆CSDN

初入selenium,想着经常使用CSDN写东西,就来写一个模拟登录CSDN的,完全没有想像的顺利;
先来说一下整个selenium的思路以及在整个写的过程中需要注意的点:

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

点击“账号登录之后”,根据id='all'在当前页面寻找时,并找到这个id,而是需要在更新之后的页面寻找ID,在这里弄了很久才解决,因为前端知识的薄弱,很是尴尬;
from selenium import webdriver from time import sleep from selenium.webdriver.support.ui import WebDriverWaitdriver = 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_handlesfor 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
文章图片

【python selenium 登陆CSDN】前端基础比较薄弱,按照我自己理解的地方来分析代码:按照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

    推荐阅读