登录
转载

python-selenium开发(1:基础用法)

发布于 2021-04-06 阅读 31
  • 后端
  • Python
转载

selenium 是一个 web 的自动化测试工具,它可以通过id/css/class/xpath等定位到具体的网页元素并进行一系列操作,从而实现自动化测试!

安装:pip install selenium

使用: 1.import selenium 2.from selenium import xxx

1.安装webdriver 使用selenium首先需要安装webdriver,来连接到浏览器,并进行交互,从而实现脚本控制浏览器! 我在谷歌浏览器和火狐浏览器都装了:

火狐浏览器webdriver下载地址 谷歌浏览器webdriver下载地址1 谷歌浏览器webdriver下载地址2 谷歌浏览器下载之前先在地址栏输入**chrome://version/**看一下自己的版本再下载对应的 2.启动浏览器:

from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.baidu.com/')

同理:

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.baidu.com/')

3.定位网页元素 网页元素的定位是自动化测试的核心,也是最容易踩坑的地方,这个地方需要格外注意一下!通常的定位网页元素的方法有以下几种:

1.id定位:find_element_by_id() 2.name定位:find_element_by_name() 3.class定位:find_element_by_class_name() 4.link定位:find_element_by_link_text() 5.partial link text定位:find_element_by_partial_link_text() 6.tag定位:find_element_by_tag_name() 7.xpath定位:find_element_by_xpath() 8.css定位:find_element_by_css_selector()

有的class name是有多个class组合的复合类,中间以空格隔开,使用find_element_by_class_name()就会定位失败,这时可以用"."代替空格。 还可以用find_elements_by_xx定位一组元素

4.selenium设置等待时间 有的时候网页内容在缓存或者网页切换延迟等,会导致下一次定位元素失败,因此需要设置等待时间。 1.强制等待:

import time
time.sleep(x)

2.显示等待 显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
element = WebDriverWait(driver, 5,0.5).until(EC.presence_of_element_located((By.ID, "kw")))
element.send_keys('selenium')
driver.quit()

WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下: WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

  • driver :浏览器驱动。
  • timeout :最长超时时间,默认以秒为单位。
  • poll_frequency :检测的间隔(步长)时间,默认为0.5s。
  • ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。
  • WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。 1.until(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为True。 2. until_not(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为False。 在本例中,通过as关键字将expected_conditions 重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。

    3.隐式等待

    from selenium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    from time import ctime
    driver = webdriver.Firefox()
    # 设置隐式等待为10秒
    driver.implicitly_wait(10)
    driver.get("http://www.baidu.com")
    try:
        print(ctime())  driver.find_element_by_id("kw22").send_keys('selenium')
    except NoSuchElementException as e:
        print(e)
    finally:
        print(ctime())
        driver.quit()
    
    

    WebDriver提供了implicitly_wait()方法来实现隐式等待,默认设置为0。 implicitly_wait() 默认参数的单位为秒,本例中设置等待时长为10秒。 首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。 其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。 假设在第6秒定位到了元素则继续执行,若直到超出设置时长(10秒)还没有定位到元素,则抛出异常。 隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。

    5.控制浏览器操作

    函数作用
    driver.set_windows_size()设置浏览器大小 (参数为像素点)
    driver.back()回退页面
    driver.forward()前进页面
    driver.refresh()刷新页面
    driver.maximize_window()页面最大化
    driver.minimize_window()页面最小化
    from selenium import webdriver
    driver = webdriver.Firefox()
    
    #访问百度首页
    first_url= 'http://www.baidu.com'
    print("now access %s" %(first_url))
    driver.get(first_url)
    driver.maximize_window()
    #访问新闻页面
    second_url='http://news.baidu.com'
    print("now access %s" %(second_url))
    driver.get(second_url)
    
    #返回(后退)到百度首页
    print("back to  %s "%(first_url))
    driver.back()
    
    #前进到新闻页
    print("forward to  %s"%(second_url))
    driver.forward()
    
    driver.quit()
    
    

    7.操作网页元素

    方法作用
    click()单击元素
    clear()清除文本(如果可以)
    send_keys (value)模拟按键操作
    get_attribute(name)获取元素属性值
    is_displayed()设置该元素是否用户可见
    submit()提交表单
    size返回元素的尺寸
    location返回元素坐标
    text获取元素的文本
    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get("https://www.baidu.com")
    #刷新浏览器
    browser.refresh()
    
    #提交表单
    search_text = driver.find_element_by_id('kw')
    search_text.send_keys('selenium')
    search_text.submit()
    
    # 获得输入框的尺寸
    size = driver.find_element_by_id('kw').size
    print(size)
    loca=driver.find_element_by_id('kw').location
    print(loca)
    
    more_x = loca.get('x') #元素的x坐标
    more_y = loca.get('y') #元素的y坐标
    more_w = size.get('width')  #元素的宽
    more_h = size.get('height') #元素的高
    
    # 返回百度页面底部备案信息
    text = driver.find_element_by_id("cp").text
    print(text)
    
    # 返回元素的属性值, 可以是 id、 name、 type 或其他任意属性
    attribute = driver.find_element_by_id("kw").get_attribute('type')
    print(attribute)
    
    # 返回元素的结果是否可见, 返回结果为 True 或 False
    result = driver.find_element_by_id("kw").is_displayed()
    print(result)
    
    driver.quit()
    
    
    

    8.鼠标操作

    在 WebDriver 中, 将关于鼠标操作的方法封装在 ActionChains 类提供。

    from selenium.webdriver import ActionChains
    
    

    导入提供鼠标操作的 ActionChains 类。

    ActionChains(driver)
    
    

    调用 ActionChains()类, 将浏览器驱动 driver 作为参数传入。 常用函数:

    函数作用
    double_click()双击
    drag_and_drop(source, target)拖拽到某个元素然后松开
    move_to_element(above)鼠标移动到某个元素上悬停
    context_click()模拟鼠标右键操作, 在调用时需要指定元素定位(右击)
    perform()执行所有 ActionChains 中存储的行为, 可以理解成是对整个操作的提交动作。
    click(on_element=None)单击鼠标左键
    move_by_offset(xoffset, yoffset)鼠标从当前位置移动到某个坐标
    drag_and_drop_by_offset(source, xoffset, yoffset)拖拽到某个坐标然后松开
    key_down(value, element=None)按下某个键盘上的键
    key_up(value, element=None)松开某个键
    release(on_element=None)在某个元素位置松开鼠标左键
    send_keys_to_element(element, *keys_to_send)发送某个键到指定元素
    move_to_element_with_offset(to_element, xoffset, yoffset)移动到距某个元素(左上角坐标)多少距离的位置
    from selenium import webdriver
    # 引入 ActionChains 类
    from selenium.webdriver.common.action_chains import ActionChains
    
    driver = webdriver.Chrome()
    driver.get("https://www.baidu.cn")
    
    # 定位到要悬停的元素
    above = driver.find_element_by_link_text("设置")
    # 对定位到的元素执行鼠标悬停操作
    ActionChains(driver).move_to_element(above).perform()
    
    

    9.键盘操作

    函数作用
    send_keys(Keys.BACK_SPACE)删除键(BackSpace)
    send_keys(Keys.SPACE)空格键(Space)
    send_keys(Keys.TAB)制表键(Tab)
    send_keys(Keys.ESCAPE)回退键(Esc)
    send_keys(Keys.ENTER)回车键(Enter)
    send_keys(Keys.CONTROL,‘a’)全选(Ctrl+A)
    send_keys(Keys.CONTROL,‘c’)复制(Ctrl+C)
    send_keys(Keys.CONTROL,‘x’)剪切(Ctrl+X)
    send_keys(Keys.CONTROL,‘v’)粘贴(Ctrl+V)
    send_keys(Keys.F1)键盘 F1
    from selenium import webdriver
    # 引入 Keys 模块
    from selenium.webdriver.common.keys import Keys
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    
    # 输入框输入内容
    driver.find_element_by_id("kw").send_keys("seleniumm")
    
    # 删除多输入的一个 m
    driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
    
    
    # 输入空格键+“教程”
    driver.find_element_by_id("kw").send_keys(Keys.SPACE)
    driver.find_element_by_id("kw").send_keys("教程")
    
    # ctrl+a 全选输入框内容
    driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')
    
    # ctrl+x 剪切输入框内容
    driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')
    
    # ctrl+v 粘贴内容到输入框
    driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v')
    
    # 通过回车键来代替单击操作
    driver.find_element_by_id("su").send_keys(Keys.ENTER)
    driver.quit()
    
    

    10.获取断言信息 拿实际结果与预期进行比较,这个比较的称之为断言,通常通过获取title 、URL和text等信息进行断言。

    title:用于获得当前页面的标题。
    
    current_url:用户获得当前页面的URL。
    
    text:获取搜索条目的文本信息。
    
    
    from selenium import webdriver
    from time import sleep
    
    
    driver = webdriver.Firefox()
    driver.get("https://www.baidu.com")
    
    print('Before search================')
    
    # 打印当前页面title
    title = driver.title
    print(title)
    
    # 打印当前页面URL
    now_url = driver.current_url
    print(now_url)
    
    driver.find_element_by_id("kw").send_keys("selenium")
    driver.find_element_by_id("su").click()
    sleep(1)
    
    print('After search================')
    
    # 再次打印当前页面title
    title = driver.title
    print(title)
    
    # 打印当前页面URL
    now_url = driver.current_url
    print(now_url)
    
    # 获取结果数目
    user = driver.find_element_by_class_name('nums').text
    print(user)
    
    driver.quit()
    
    

    运行结果如下:

    Before search================
    百度一下,你就知道
    https://www.baidu.com/
    After search================
    selenium_百度搜索
    https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx...
    搜索工具
    百度为您找到相关结果约5,380,000个
    
    

    评论区

    我是搬运工2号,没人自称1号

    0

    0

    0