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

17727591462

联系电话

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

使用Selenium模拟登陆新浪微博-自动化测试

更新时间:2022-03-29 09:50:22 作者:多测师 浏览:171

  一.selenium基本使用

  1.selenium安装及基本操作

  selenium是一个自动化测试工具,它支持各种浏览器,包括Chrome,Safari,Firefox等主流界面浏览器驱动,也包括Phantomjs的无界面浏览器。

  通过selenium+phantomjs可以直接渲染js

  首先,需要下载不同浏览器的驱动,直接百度搜索就可以,例如搜过Chrome浏览器驱动,下载到本地

  然后,将下载好的驱动放入到安装python的根目录下,例如C:/pyhton3/usr/bin,就是要把驱动和python.exe放在同一个文件夹。(虚拟环境也是一样,放入对应的虚拟环境下的python的根目录)

  最后,通过pip安装selenium模块。

使用Selenium模拟登陆新浪微博-自动化测试

  # coding = utf-8

  import time

  from selenium import webdriver # 导入模块

  driver = webdriver.Chrome() # 1.声明浏览器对象

  driver.get('https://www.baidu.com') # 2. 访问地址

  # dirver.get('https://www.weibo.com')

  try:

  driver.save_screenshot('test.jpg') # 3.操作。截图

  finally:

  time.sleep(3)

  driver.close() # 4.关闭浏览器

  这里模拟一个浏览器,访问百度,并将浏览器打开后的页面进行截图。

  2.元素选取

  要用代码操作浏览器,访问网页,做一些操作必须要通过定位,获得要操作元素的位置,例如,要在百度输入框搜索python关键词,要经过如下操作:

  首先,通过代码定位到输入框所在位置;

  然后,通过代码在输入框中输入关键字

  最后,通过代码实现点击搜索。

  import time

  from selenium import webdriver # 导入模块

  driver = webdriver.Chrome() # 1.声明浏览器对象

  driver.get('https://www.baidu.com') # 2. 访问地址

  try:

  # 通过审查元素,发现百度输入框的id为kw,

  # 通过find_element_by_id("kw")定位到该输入框

  # 通过send_keys("Python") 实现在输入框中输入关键字

  driver.find_element_by_id('kw').send_keys('python') # 输入数据

  # 同样的,通过find_element_by_id定位“百度一下”按钮

  # 通过click()实现点击

  driver.find_element_by_id('su').click()

  finally:

  time.sleep(30)

  driver.close()

  当然,还有很多其他方式来定位:

  # 通过文本,定位贴吧的位置,并点击

  driver.find_element_by_link_text('贴吧').click() # 通过文本链接点击进入

  # 通过xpath路径定位元素

  driver.find_element_by_xpath('//*[@id="1"]/h3/a[1]').click()

  # 通过元素的name来定位,当然,后可以by_class_name()

  driver.find_element_by_name('loginname').send_keys('13212702940')

  还有一些常用操作

  print(driver.page_source) # 获取网页经过js渲染的源代码,相当于审查元素

  # driver.find_elements_by_id() # 获取多个元素

  # driver.find_element_by_css_selector

  3.页面交互

  1)窗口切换

  使用selenium操作浏览器的时候肯定会有很多窗口,selenium默认不切换窗口,所以需要有方法实现窗口的切换。

  切换窗口有如下方法:

  通过driver.window_handlers获取每个窗口的操作对象,然后for循环,实现切换窗口的目的。

  for handler in driver.window_handlers:

  driver.switch_to_window(handler)

  2)cookies处理

  在selenium中,cookies的用法一般是通过模拟登陆之后,获取到cookies值,再通过requests等库实现请求,

  增加效率。

  cookie = {}

  for item in driver.get_cookies():

  cookie[item.get('name')] = item.get('value')

  3)元素拖动

  在selenium中,除了简单的点击动作外,还有一些稍微复杂的动作,例如元素的拖动。

  在实现元素拖动中时,需要另一个模块。ActionChains模块满足对鼠标操作的要求。

  ActionChains的执行原理就是当调用ActionChains方法时,不会立即执行,而是将所有操作暂时放在一个队列中,

  当调用perform()方法时,队列会按照放入的先后顺序,依次执行。

  例如验证码的滑动,其实就是将一个元素拖动到某一个位置,然后松开,因此,元素的拖动经过下面几个步骤:

  将鼠标移上去,点击鼠标左键不放,拖拽到目的点,松开鼠标

  ActionChains中提供的方法:

  # click(on_element=None) # 单击鼠标左键

  # click_and_hold(on_element=None) # 点击鼠标左键,按住不放

  # context_click(on_element=None) # 点击鼠标右键

  # double_click(on_element=None) # 双击鼠标左键

  # drag_and_drop(source, target) # 拖拽到某个元素,然后松开

  # drag_and_drop_by_offset(source, xoffset, yoffset) # 拖拽到某个坐标然后松开

  # move_by_offset(xoffset, yoffset) # 鼠标移动到距离当前位置(x, y)

  # move_to_element(to_element) # 移动到某个元素

  #

  # # 将鼠标移动至距离某个元素多少距离的位置

  # move_to_element_with_offset(to_element, xoffset, yoffset)

  #

  # release(on_element=None) # 在某个元素位置松开鼠标左键

  # perform() # 执行链中的所有动作

  来一个简单拖拽例子,测试网址:http://www.treejs.cn/v3/demo/cn/exedit/drag.html

  # 实例化一个浏览器

  driver = webdriver.Chrome()

  try:

  # 打开页面(可以自己先打开试一下)

  driver.get('http://www.treejs.cn/v3/demo/cn/exedit/drag.html')

  time.sleep(2)

  # 1.通过id定位要拖动的元素元素(相当于鼠标移上去)

  element = driver.find_element_by_id('treeDemo_2_span')

  # 2.通过id定位要拖到的位置

  target = driver.find_element_by_id('treeDemo_3_span')

  # 拖动元素到目标位置

  ActionChains(driver).drag_and_drop(element, target).perform()

  time.sleep(15)

  finally:

  driver.quit()

  4)弹窗处理

  很多网页里面可能会出现弹窗,需要对弹窗进行一定的处理(就是js里的alert())。

  使用:

  driver.switch_to_alert() # 切换到弹窗

  time.sleep(3)

  driver.accept() #接收弹窗

  对弹窗进行处理。

  4.页面等待

  现在的大多数web应用,越来越多采用了Ajax技术,以及程序不能确定某个元素何时完全加载出来,

  这会让元素定位困难,会提高ElementNotVisibleException的概率,因此出现了等待。

  就是等待页面中,某个元素出现,就执行某些代码。selenium提供两种等待方式。

  1)显式等待

  显式等待是指定某个条件,然后设置最长等待时间,如果在这个时间里面还没有找到元素,那么就抛出异常。

  显式等待主要使用了WebDriverWait类和excepted_conditions模块。

  WebDriverWait是显式等待类,主要方法有:

  __init__中:

  driver:传入的WebDriver实例

  timeout:超时时间,等待的最长时间(同时要考虑隐性等待时间)

  poll_frequency:调用until中的方法的间隔时间,默认0.5s

  ignored_exception:忽略的异常,如果在调用until过程中,抛出这个异常,则不中断代码,继续执行

  如果抛出的是这个元组外的异常,则代码中观,抛出异常,默认只有NoSuchElementException

  until中:

  method:在等待期间,每隔一段时间,调用这个传入的方法,直到返回值不是False

  message:如果超时,抛出TimeOutException,将message传入异常。

  expected_conditions是selenium的一个模块,其中包含一系列等待的条件:

  """

  title_is

  title_contains

  #这两个条件类验证title,验证传入的参数title是否等于或包含于driver.title

  presence_of_element_located

  presence_of_all_elements_located

  这两个人条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw')

  顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行

  visibility_of_element_located

  invisibility_of_element_located

  visibility_of

  这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement

  第一个和第三个其实质是一样的

  text_to_be_present_in_element

  text_to_be_present_in_element_value

  这两个人条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value

  frame_to_be_available_and_switch_to_it # 有些页面有frame标签,该标签出现后才能定位,例如QQ空间

  这个条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement

  alert_is_present

  这个条件判断是否有alert出现

  element_to_be_clickable

  这个条件判断元素是否可点击,传入locator

  """

  简单例子:访问百度首页,等待“贴吧”那个地方出现,出现后就拿它的链接

  from selenium import webdriver

  from selenium.webdriver.support.wait import WebDriverWait

  from selenium.webdriver.support import expected_conditions as EC

  from selenium.webdriver.common.by import By

  driver = webdriver.Chrome()

  driver.get('https://baidu.com')

  locator = (By.LINK_TEXT, '贴吧')

  try:

  # 等待,直到locator出现为止,driver在20s内,每0.5s检查一次该元素是否出现

  # 出现,执行后面内容;没出现,继续等待(20s内,超过就抛异常)

  WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))

  # 出现后直接获取贴吧的链接

  print(driver.find_element_by_link_text('贴吧').get_attribute('href'))

  finally:

  driver.close()

  2)隐式等待

  隐性等待implicitly_wait(xx),隐形等待是设置了一个最长等待时间,

  如果在规定时间内网页加载完成,则执行下一步,

  否则一直等到时间截止,然后执行下一步。

  弊端就是程序会一直等待整个页面加载完成,就算你需要的元素加载出来了还是需要等待。

  from selenium import webdriver

  driver = webdriver.Chrome()

  driver.implicitly_wait(30)

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

  2.Phantomjs的使用

  PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎。

  它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG。

  phantomjs常用配置:

  # 引入配置对象DesiredCapabilities

  from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

  dcap = dict(DesiredCapabilities.PHANTOMJS)

  #从USER_AGENTS列表中随机选一个浏览器头,伪装浏览器

  dcap["phantomjs.page.settings.userAgent"] = (random.choice(USER_AGENTS))

  # 不载入图片,爬页面速度会快很多

  dcap["phantomjs.page.settings.loadImages"] = False

  # 设置代理

  service_args = ['--proxy=127.0.0.1:9999','--proxy-type=socks5']

  #打开带配置信息的phantomJS浏览器

  driver = webdriver.PhantomJS(phantomjs_driver_path, desired_capabilities=dcap, service_args=service_args)

  # 如果你的phantomjs配置了环境变量,就不需要填写路径(phantomjs_driver_path),否则需要添加你的phantomjs所在的路径

  3.模拟登陆

  利用selenium登录新浪微博,首先访问新浪页面,等待输入账号和密码的输入框出现,然后依次利用selenium输入账号和密码,最后点击登录,并获取登陆后的源码。

  # coding = utf-8

  """

  用selenium登录新浪微博

  """

  import time

  from selenium import webdriver

  from selenium.webdriver.support.wait import WebDriverWait

  from selenium.webdriver.support import expected_conditions as EC

  from selenium.webdriver.common.by import By

  # 1,实例化浏览器驱动

  driver = webdriver.Chrome()

  url = 'https://weibo.com/'

  # 2,给定访问目标

  driver.get(url)

  # 定位账号密码输入框并登录

  username = '184419810@qq.com'

  password = '*********'

  try:

  # 创建等待事件

  waiter = WebDriverWait(driver, 20, 0.1)

  event = (By.XPATH, '//*[@id="pl_login_form"]')

  # # 等待登录框的出现

  waiter.until(EC.presence_of_element_located(event))

  # 账号输入

  driver.find_element_by_xpath('//*[@id="loginname"]').send_keys(username)

  time.sleep(1)

  # 密码输入

  driver.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[2]/div/input').send_keys(password)

  time.sleep(1)

  # 点击登录

  driver.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[6]/a').click()

  # 获取登录后的源码

  print(driver.page_source)

  except Exception as e:

  print(e)

  finally:

  time.sleep(10)

  driver.close()

  以上内容为大家介绍了自动化测试中的使用Selenium模拟登陆新浪微博,本文由多测师亲自撰写,希望对大家有所帮助。了解更多自动化测试相关知识:https://www.aichudan.com/xwzx/

联系电话

17727591462

返回顶部