zoukankan      html  css  js  c++  java
  • selenium模块控制浏览器

    利用selenium模块控制浏览器


    导入selenium模块:from selenium import webdriver


    browserFirefox = webdriver.Firefox()#打开Firefox浏览器,返回一个Webdriver对象


    browserFirefox.get('http://www.baidu.com')


    Webdriver对象有两种方法:
    find_element_*和find_elements_*方法
    1、find_element_*:返回一个WebElement对象,代表页面中的匹配查询到的第一个元素
    2、find_elements_*:返回的是WebElement_*对象的列表,包含页面中所有匹配的元素


    元素定位:
    find_element_by_id()    //根据id属性定位
    find_element_by_name()   //根据name属性定位
    find_element_by_class_name()    //根据class属性定位
    find_element_by_link_text()      //根据文字链接
    find_element_by_partial_link_text()    //根据文字链接的一部分
    find_element_by_tag_name()       //根据标签名称

    find_element_by_xpath()  //根据xpath定位,xpath如何用多个属性定位, find_element_by_xpath("//div[@class='x' and name='b']")

    绝对路径写法(只有一种),写法如下:

    引用页面上的form元素(即源码中的第3行):/html/body/form[1]

    注意:1. 元素的xpath绝对路径可通过firebug直接查询。2. 一般不推荐使用绝对路径的写法,因为一旦页面结构发生变化,该路径也随之失效,必须重新写。3. 绝对路径以单/号表示,而下面要讲的相对路径则以//表示,这个区别非常重要。另外需要多说一句的是,当xpath的路径以/开头时,表示让Xpath解析引擎从文档的根节点开始解析。当xpath路径以//开头时,则表示让xpath引擎从文档的任意符合的元素节点开始进行解析。而当/出现在xpath路径中时,则表示寻找父节点的直接子节点,当//出现在xpath路径中时,表示寻找父节点下任意符合条件的子节点,不管嵌套了多少层级(这些下面都有例子,大家可以参照来试验)。弄清这个原则,就可以理解其实xpath的路径可以绝对路径和相对路径混合在一起来进行表示,想怎么玩就怎么玩

    下面是相对路径的引用写法:

    查找页面根元素://

    查找页面上所有的input元素://input

    查找页面上第一个form元素内的直接子input元素(即只包括form元素的下一级input元素,使用绝对路径表示,单/号)://form[1]/input

    查找页面上第一个form元素内的所有子input元素(只要在form元素内的input都算,不管还嵌套了多少个其他标签,使用相对路径表示,双//号)://form[1]//input

    查找页面上第一个form元素://form[1]

    查找页面上id为loginForm的form元素://form[@id='loginForm']

    查找页面上具有name属性为username的input元素://input[@name='username']

    查找页面上id为loginForm的form元素下的第一个input元素://form[@id='loginForm']/input[1]

    查找页面具有name属性为contiune并且type属性为button的input元素://input[@name='continue'][@type='button']

    查找页面上id为loginForm的form元素下第4个input元素://form[@id='loginForm']/input[4]

    find_element_by_css_selector()     //根据css选择器定位


    find_element_by_xpath()和find_element_by_css_selector()可以直接在chrome中的检查中copy


    除了*_by_tag_name() 方法,所有的方法的参数都是区分大小的,
    如果页面上没有元素匹配该方法要查找的元素,selenium模块就会抛出NoSuchElement异常,如果不希望程序崩溃,就在代码中加入try和except语句


    WebElement对象的属性和方法:
    tag_name             //标签名,例如'a'表示<a>元素
    get_attribute(name)  // 该元素name的属性值
    text                 //该元素内的文本,例如<span>hello</span>中的'hello'
    clear()              //对于文本字段或文本区域元素,清除其中输入的文本
    is_displayed()       //如果该元素可见,返回True,否则返回False
    is_enabled()        //对于输入元素,如果该元素启用,返回True,否则返回False
    is_selected()       //对于复选框或单选框元素,如果该元素被选中,返回True,否则返回False
    location            //一个字典,包含键'x'和'y',表示该元素在页面上的位置






    打开网页需要添加等待时间让网页加载完成:
    time.sleep(3)  #休眠3秒
    implicitly_wait() #智能等待


    对浏览器的操作:
    最大化:driver.maximize_window()
    设置宽和高:driver.set_window_size(width,height)


    浏览器的前进和后退:
    前进:driver.forward()
    后退:driver.back()
    刷新:driver.refresh()
    关闭窗口:driver.quit()


    操作对象:
    click() 点击对象
    send_keys()  模拟按键输入
    clear()  清除对象内容
    submit()  如果有submit按钮,自动提交表单
    text  获取文本信息
    get_attribute()  获取属性值


    键盘操作:(引入keys包)
    from selenium.webdriver.common.keys import Keys


    Keys.DOWN,Keys.UP,Keys.LEFT,Keys.RIGHT----键盘箭头键
    Keys.ENTER,Keys.RETURE----回车和换行键
    Keys.HOME,Keys.END,Keys.PAGE_DOWN,Keys.PAGE_UP----Home键、END键、Page_down键和Page_up键
    Keys.ESCAPE,Keys.BACK_SPACE,Keys.DELETE----Esc,Backspace和Delete键
    Keys.F1,Keys.F2,......Keys.F3----键盘顶部F1-F12键
    Keys.TAB----Tab键


    driver.find_element_by_id("xx").send_keys(Keys.ENTER) (输入回车)
    Keys.TAB  #换行
    组合键:
    send_keys(Keys.CONTROL,'a') #ctrl+a


    鼠标操作:导入ActionChains包
    from selenium.webdriver.common.action_chains import ActionChains


    dr.find_element_by_id("xx").context_click() #右击
    double_click()  #双击
    drag_and_drop(a,b)  #将a拖动到b位置


    定位一组元素:将元素定位中的element换成elements,返回的是列表


    多层框架/窗口
    switch_to_frame("frame_name")#可以传入id、name、index以及selenium的WebElement对象,直接切换
    如果只有class时,只能先找到再切换:
    frame = driver.find_element_by_class_name("APP-editor-iframe")  #若iframe有id或是name属性,可以直接切换
    driver.switch_to_frame(frame)






    switch_to_window("window_name")
    例子:
    #获取hao123主页的句柄
    handle_hao123 = driver.current_window_handle,然后传入参数
    #获取所有窗口的句柄
    all_handles = driver.window_handles
    #根据窗口句柄的再判断,切换到163窗口
    for handle in all_handles:
        if handle != handle_hao123:
            driver.switch_to.window(handle)
            


    上传文件:driver.find_element_by_id("xx").send_keys(文件路径名,绝对相对都可以)




    对话框
    text 返回alert/confirm/prompt 中的文字信息
    accept 点击确认按钮
    dismiss 点击取消按钮,如果有的话
    send_keys 输入值,这个alertconfirm 没有对话框就不能用了,不然会报错。




    调用js:execute_script(script,*args) #在当前窗口执行js脚本


    cookie处理:
    driver.get_cookies() 获得cookie 信息
    add_cookie(cookie_dict) 向cookie 添加会话信息
    delete_cookie(name) 删除特定(部分)的cookie
    delete_all_cookies() 删除所有cookie

  • 相关阅读:
    友元函数
    异常处理
    RTTI
    接口类
    纯虚函数和抽象类
    虚函数与虚析构函数原理
    查看表空间使用率及shrink 表空间
    RAC fail over 测试
    js判断数组中是不是有某个元素
    layui 表格图片放大
  • 原文地址:https://www.cnblogs.com/nuomin/p/8420800.html
Copyright © 2011-2022 走看看