selenium 模拟浏览器登录微博

selenium 模拟浏览器登录微博

selenium 是一个自动化测试工具 , 支持多种浏览器 , 可以用来做 web 页面的自动化测试。这次主要是来记录一下通过 python+selenium+chromeDriver 模拟浏览器登录新浪微博。

1.准备工作

  • python (本次使用的是 python3)
  • selenium 库
  • chromeDriver
  • chrome 浏览器

注意: chromeDriver 有多个版本 , 每个版本对应固定的 chrome 浏览器版本 , 需要根据 chrome 的版本下载对应的 chromeDriver。

2.模拟登陆

接下来就可以开始登录了 , 直接上代码。

import os
from selenium import webdriver

# 引入 chromedriver.exe
chromedriver = "D:\python3\Scripts\chromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
browser = webdriver.Chrome(chromedriver)

# 设置浏览器需要打开的 url
url = "https://weibo.com/"
browser.get(url)

# 隐式等待
browser.implicitly_wait(10)
# 获取组件并传值
browser.find_element_by_id("loginname").send_keys("username")
browser.find_element_by_name("password").send_keys("password")
browser.find_element_by_class_name("btn_32px").click()

# 关闭浏览器
# browser.quit()

在最开始的时候 , 引入 chromeDriver 的程序 , 获取浏览器变量。设置需要访问的 url 并用 get 方式打开。根据页面组件的属性获取到组件并传值 , 最后模拟点击登录按钮 , 即可完成登录。

3. 需要注意的坑

整个过程逻辑非常简单 , 但是这里面有两个坑需要注意一下。

3.1 selenium.common.exceptions.NoSuchElementException

在发出 get 请求后 , 如果马上获取组件会提示 org.openqa.selenium.NoSuchElementException 错误 , 原因可能是元素还没加载好 , 如果马上通过 find_element_by_id 获取其他方法获取组件 , 则会提示你找不到对应的元素。这时候 , 只能等待页面加载完成后(这里使用隐式等待的方式 , 等待十秒) , 再获取。

3.2 selenium.common.exceptions.InvalidSelectorException

如果去 新浪微博 看的话 , 会发现 , 起始登录按钮的 class 名称如下图:

按钮 class

class = "W_btn_a btn_32px"

但是一旦使用这个 class 属性获取登录按钮 , 就会提示 selenium.common.exceptions.InvalidSelectorException , 提示你属性错误。class 属性中间的空格表示的并不是空字符 , 而是间隔符号 , 标识一个元素有多个 class 属性 , 这时候只需要选出唯一的 class 属性来获取元素即可。

代码

你可能感兴趣的:(python)