多测师是一家拥有先进的教学理念,强大的师资团队,业内好评甚多的接口自动化测试培训机构!

17727591462

联系电话

您现在所在位置:接口自动化测试培训 > 新闻资讯

Selenium+Requests进行Cookies保存读取操作-自动化测试

更新时间:2022-03-30 09:19:19 作者:多测师 浏览:346

  本篇我们就来说一下cookies的基本应用

  使用selenium模拟登陆百度

Selenium+Requests进行Cookies保存读取操作-自动化测试

  from selenium import webdriver

  from selenium.webdriver.common.by import By

  from selenium.webdriver.support.wait import WebDriverWait

  from selenium.webdriver.support import expected_conditions as EC

  from PIL import Image

  chrome_option = webdriver.ChromeOptions()

  chrome_path = "/usr1/webdrivers/chromedriver"

  def login_baidu():

  driver = None

  try:

  driver = webdriver.Chrome(executable_path=chrome_path)

  driver.get("https://www.baidu.com")

  print(driver.title)

  WebDriverWait(driver, 10, 0.5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="u1"]/*[@class="lb"]')))

  element = driver.find_element_by_xpath('//*[@id="u1"]/a[7]')

  element.click()

  WebDriverWait(driver, 10, 0.5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__footerULoginBtn"]')))

  element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__footerULoginBtn"]')

  element.click()

  WebDriverWait(driver, 10, 0.5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__userName"]')))

  element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__userName"]')

  element.send_keys("账号")

  WebDriverWait(driver, 10, 0.5).until(

  EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__password"]')))

  element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__password"]')

  element.send_keys(密码")

  WebDriverWait(driver, 10, 0.5).until(

  EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__verifyCodeImg"]')))

  element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__verifyCodeImg"]')

  driver.get_screenshot_as_file("qrcode.png")

  image = Image.open("qrcode.png")

  left = element.location.get("x")

  top = element.location.get("y")

  right = left + element.size.get("width")

  bottom = top + element.size.get("height")

  cropImg = image.crop((left, top, right, bottom))

  cropImg.save("code.png")

  yanzheng = input(">>>")

  WebDriverWait(driver, 10, 0.5).until(

  EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__verifyCode"]')))

  element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__verifyCode"]')

  element.send_keys(yanzheng)

  WebDriverWait(driver, 10, 0.5).until(

  EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__submit"]')))

  element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__submit"]')

  element.click()

  # 如果需要手机验证码

  try:

  WebDriverWait(driver, 10, 0.5).until(

  EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__36__button_send_mobile"]')))

  element = driver.find_element_by_xpath('//*[@id="TANGRAM__36__button_send_mobile"]')

  element.click()

  WebDriverWait(driver, 10, 0.5).until(

  EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__36__input_vcode"]')))

  element = driver.find_element_by_xpath('//*[@id="TANGRAM__36__input_vcode"]')

  duanxin = input(">>>")

  element.send_keys(duanxin)

  WebDriverWait(driver, 10, 0.5).until(

  EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__36__button_submit"]')))

  element = driver.find_element_by_xpath('//*[@id="TANGRAM__36__button_submit"]')

  element.click()

  except Exception as e:

  print(e)

  driver.get_screenshot_as_file("screen.png")

  finally:

  print("关闭")

  if driver:

  driver.quit()

  selenium操作很简单,这里不做详解讲解,以后我们开爬虫基础系列文章的时候会讲到。

  selenium保存cookies

  cookies = driver.get_cookies()

  with open("cookies.txt", "w") as fp:

  json.dump(cookies, fp)

  这里切记,如果我们要使用json.load读取数据,那么一定要使用json.dump来写入数据,不能使用str(cookies)直接转为字符串进行保存,因为其存储格式不同。这样我们就将cookies保存在文件中了。

  selenium读取cookies

  def read_cookies():

  # 设置cookies前必须访问一次百度的页面

  driver.get("http://www.baidu.com")

  with open("cookies.txt", "r") as fp:

  cookies = json.load(fp)

  for cookie in cookies:

  # cookie.pop('domain') # 如果报domain无效的错误

  driver.add_cookie(cookie)

  driver.get("http://www.baidu.com")

  这里不用登录就会直接显示我的用户名。而且要注意不同的浏览器可能处理方式不同,比如在火狐浏览器中就会报错:selenium.common.exceptions.InvalidCookieDomainException: Message: .baidu.com,如果碰到这种错误(不一定,也可能跟系统、浏览器都有关系),在add_cookie的时候我们可以把domain去掉就行了。

  requests读取cookies

  import requests

  from requests.cookies import RequestsCookieJar

  s = requests.session()

  s.verify = False

  s.headers = {

  "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"

  }

  s.get("http://www.baidu.com")

  #这里我们使用cookie对象进行处理

  jar = RequestsCookieJar()

  with open("cookies.txt", "r") as fp:

  cookies = json.load(fp)

  for cookie in cookies:

  jar.set(cookie['name'], cookie['value'])

  #百度个人中心

  r = s.get("https://www.baidu.com/p/setting/profile/basic", cookies=jar)

  # 也可以使用字典设置

  cookies_dict = dict()

  with open("cookies.txt", "r") as fp:

  cookies = json.load(fp)

  for cookie in cookies:

  cookies_dict[cookie['name']] = cookie['value']

  r = s.get("https://www.baidu.com/p/setting/profile/basic", cookies=cookies_dict)

  r.encoding = "utf-8"

  print(r.text)

  requests库可以使用cookies对象和dict对象来指定cookies,这个可以看一下源码

  通过requests读取cookies的使用,我们知道在cookies中我们一般只使用name和value,像domain、path等值都是不需要使用的,而且上面传入cookies字典的例子我们知道,只要保存了cookies中的name和value,无论你以什么样的方式保存,文件、或者数据库等,最后读取出来只要生成对应的字典格式就行了。

  requests保存cookies

  import requests

  s = requests.session()

  s.verify = False

  s.headers = {

  "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"

  }

  # 这里可以是模拟登陆的步骤

  s.get("http://www.baidu.com")

  cookies = requests.utils.dict_from_cookiejar(s.cookies)

  with open("cook.txt", "w") as fp:

  json.dump(cookies, fp)

  print(cookies)

  首先我们看一下requests.session里面的cookies,它是一个RequestsCookieJar对象,这就是我们在上面使用的时候用RequestsCookieJar对象读取cookies的原因了

  下面我们看到requests.utils.dict_from_cookiejar方法,这是requests库提供的一个方法,把上面的RequestsCookieJar对象转换为一个字典(字典里只有name和value),这就是我上面说的,requests库只使用name和value值,而我们selenium中保存的cookies中包含domain、path等信息。

  上面我都是将cookies值保存在文件中,在大多数情况下我们一般使用都是将其保存在数据库中,启动一个服务器专门进行登录验证并保存cookies值。

  以上内容为大家介绍了自动化测试中的Selenium+Requests进行Cookies保存读取操作,本文由多测师亲自撰写,希望对大家有所帮助。了解更多自动化测试相关知识:https://www.aichudan.com/xwzx/

联系电话

17727591462

返回顶部