Selenium笔记

  1. 基础使用
    from selenium import webdriver
    driver = webdriver.Firefox()
    driver.get("https://www.baidu.com")
    #刷新
    driver.refresh()
    #前进
    driver.forward()
    #后退
    driver.back()
    #设置窗口大小
    driver.set_window_size(500,500)
    #截图
    driver.get_screen_shot_as_file("D:/1.jpg")
    #关闭窗口
    driver.close()
    #退出浏览器
    driver.quite()

     

  2. 八大定位方法,对应有定位一组元素方法,find_elements_by_xx即可,返回元素列表
    driver.find_element_by_id("kw")
    driver.find_element_by_name("wd")
    driver.find_element_by_class_name("s_ipt")
    driver.find_element_by_tag_name("input")
    driver.find_element_by_xpath("//input[@id='kw']")
    driver.find_element_by_css_selector("input#kw")
    driver.find_element_by_link_text("hao123")
    driver.find_element_by_partial_link_text("123")
    

     

  3. xpath定位
    driver.find_element_by_xpath("//input[@id='kw']")#属性定位
    driver.find_element_by_xpath("//button[text()='确定']")#文本定位
    driver.find_element_by_xpath("//div[@class='nr']/input")#层级定位,先定位到父级以上元素在定位
    driver.find_element_by_xpath("//select[@id='nr']/option[1]")#索引定位,从1开始
    driver.find_element_by_xpath("//div[@id='kw' and name='kw']")#逻辑运算定位
    driver.find_element_by_xpath("//*[contains(text(),'小明')]")#模糊定位
    driver.find_element_by_xpath("//*[starts-with(@class,'btn')]")
    
  4. css定位

    # 1.css用#号表示id属性,如:#kw
    driver.find_element_by_css_selector("#kw")
    # 2..css用.表示class属性,如:.s_ipt
    driver.find_element_by_css_selector(".s_ipt")
    # 3..css直接用标签名称,无任何标示符,如:input
    driver.find_element_by_css_selector("input")
    # 4  其他属性如.[name='wd']
    driver.find_element_by_css_selector("[name='wd']")
    driver.find_element_by_css_selector("input#kw")
    driver.find_element_by_css_selector("input[id='kw']")
    #5.层级关系
    driver.find_element_by_css_selector("div>input[name='lilei']")
    #6.索引定位
    driver.find_element_by_css_selector("select>option:nth-child(3)")
    driver.find_element_by_css_selector("input[id='kw'][name='wd']")#两个属性定位

     

  5. 键盘和鼠标事件

    input_element.click()
    input_element.clear()
    input_element.send_keys("python")
    input_element.submit()#表单提交
    #键盘操作,如果鼠标操作不行可用键盘操作
    from selenium.webdriver.common.keys import Keys
    input_element.send_keys(Keys.ENTER)#按回车键
    input_element.send_keys(Keys.CONTROL,"C")#复制
    #鼠标悬停事件
    from selenium.webdriver.common.action_chains import ActionChains
    ActionChains(driver).move_to_element(input_element).perform()#悬停
    ActionChains(driver).context_click(input_element).perform()#右击

     

  6. 多窗口/frame

    #多窗口,frame
    driver.current_window_handle#当前窗口句柄
    all_h = driver.window_handles#所有句柄
    driver.switch_to.window(all_h[1])#切换过去后操作完毕
    #frame的切换是默认支持id和name的方法的
    frame_element = driver.find_element_by_id("frame")
    driver.switch_to.frame(frame_element)
    driver.switch_to.default_content()#切换回默认

     

  7. Select与Alert

    select_element=driver.find_element_by_id("nr")
    Select(select_element).select_by_visible_text("10条")
    Select(select_element).select_by_value("20")
    Select(select_element).deselect_by_index(0)
    
    # 1.先用switch_to_alert()方法切换到alert弹出框上
    alert_1 = driver.switch_to.alert()
    #
    # 2.可以用text方法获取弹出的文本 信息
    alert_1.text
    # 3.accept()点击确认按钮
    alert_1.accept()
    # 4.dismiss()相当于点右上角x,取消弹出框
    alert_1.dismiss()
    

     

  8. JS处理

    #滚动到底部
    js = "window.scrollTo(0,document.body.scrollHeight)"
    driver.execute_script(js)
    
    #滚动到顶部
    js = "window.scrollTo(0,0)"
    driver.execute_script(js)
    
    # 去掉元素的readonly属性
    js = 'document.getElementById("train_date").removeAttribute("readonly");'
    driver.execute_script(js)
    
    js = 'document.getElementById("train_date").removeAttribute("readonly");'
    driver.execute_script(js)
    #div带滑动条的样式,使用以下js进行左右上下滑动
    js = 'document.getElementById("div").scrollTop=0'
    js = 'document.getElementById("div").scrollTop=10000'
    js = 'document.getElementById("div").scrollLeft=10000'
    js = 'document.getElementById("div").scrollLeft=0'
    driver.execute_script(js)
    # 修改元素的target属性,target="_blank"会让连接在新页面打开,去掉后就会在当前界面打开
    js = 'document.getElementsByClassName("mnav")[0].target="";'
    driver.execute_script(js)
    #js处理弹窗
    js = 'document.getElementById("doyoo_monitor").style.display="none";'
    driver.execute_script(js)
    #在新标签页打开链接
     js = 'window.open("https://www.baidu.com");'
     driver.execute_script(js)
    #元素被遮盖
    Element <a class="red" href="#"> is not clickable at point (1826,223) because another element <div id="load-layout" class="load-layout"> obscures it
    driver.execute_script("$('#load-layout').hide()")

     

  9. radio与checkbox

    #单选框与复选框都是先定位元素,在点击或判断是否选中
    driver.find_element_by_id("boy").click()
    # 点击后,判断元素是否为选中状态
    r = driver.find_element_by_id("boy").is_selected()

     

  10. 文件上传与下载操作

    #文件上传操作,是input标签且type是file,直接用send_keys()方法上传文件了
    driver.find_element_by_name('file').send_keys(r"D:\test\xuexi\test\14.png")
    #如果是非input标签的文件上传,就不适用于此方法了,需要借助autoit工具或者SendKeys第三方库。
    #文件下载操作
    #导入Pykeyboard(是PyUserInput库下的一个模块),使用table健切换到保存按钮,按enter键
    from pykeyboard import PyKeyboard
    k = PyKeyboard()
    k.press_key(k.tab_key)
    k.press_key(k.enter_key)

     

  11. 获取页面元素属性

    # 获取页面title
    driver.title
    # 获取其它属性方法:get_attribute("属性"),这里的参数可以是class、name等任意属性
    title = driver.title
    print title
    text = driver.find_element_by_id("setf").text
    print text
    # 获取元素的标签
    tag = driver.find_element_by_id("kw").tag_name
    print tag
    # 获取元素的其它属性
    name = driver.find_element_by_id("kw").get_attribute("class")
    print name
    # 获取输入框的内容
    driver.find_element_by_id("kw").send_keys("baiduinput")
    value = driver.find_element_by_id("kw").get_attribute("value")
    print value
    # 获取浏览器名称
    print driver.name
    #获取页面源码,通过正则进行匹配
    page = driver.page_source
    # print page
    # "非贪婪匹配,re.S('.'匹配字符,包括换行符)"
    url_list = re.findall('href=\"(.*?)\"', page, re.S)

     

  12. 判断元素是否存在

    #判断元素是否存在,1.使用find_elements方法,返回列表为空表示未找到,2.捕获异常,返回Fasle
    def is_element_exist(css):
        s = driver.find_elements_by_css_selector(css_selector=css)
        if len(s) == 0:
            print "元素未找到:%s"%css
            return False
        elif len(s) == 1:
            return True
        else:
            print "找到%s个元素:%s"%(len(s),css)
            return False
    def is_element_exits(self, *loc):
        '''
        判断元素是否存在
        :param loc: 查找元素的元组如 (By.ID,'com.topsec.topsap:id/ip')
        :return: True,元素存在,False元素不存在
        '''
        flag = None
        try:
            WebDriverWait(self.driver, 10, 0.5).until(EC.visibility_of_element_located(loc))
            flag = True
        except NoSuchElementException, e:
            print("%s为%s的元素不存在" % loc)
            flag = False
    
        finally:
            return flag

     

  13. webdriverwaite使用方法

    #webdriver对象参数
    # driver:返回浏览器的一个实例,这个不用多说
    # timeout:超时的总时长
    # poll_frequency:循环去查询的间隙时间,默认0.5秒
    #util,util_not方法参数:一个lambda函数,message参数是timeout异常后显示的消息
    from selenium.webdriver.support import expected_conditions as EC
    WebDriverWait(driver,10,1).until(EC.visibility_of_all_elements_located(By.ID,"kw"))
    
    #显示等待是在超时时间内不断循环查找元素,直到找到元素或出现异常
    # hidden或者是display = none的元素的元素可以定位到但是无法操作,需要使用js方式来修改这个属性
    # implicity_wait()默认参数的单位为妙,本例中设置等待时长为10秒,
    # 首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。
    # 其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位是,如果元素可以定位,
    # 则继续执行,如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第六秒定位到了元素则继续执行,
    # 若直到超出设置的时长10秒还没有定位到元素,则抛出异常。
    # 在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内部断的刷新页面去寻找我们需要的元素
    driver.implicitly_wait(5)

     

  14. 操作cookie

    # cookie操作的几个方法
    # 1.get_cookies():获取所有cookies
    driver.get_cookies()
    # 2.driver.get_cookie(name):获取指定name的cookie:
    driver.get_cookie("123")
    # 3.清除指定cookie:delete_cookie()
    driver.delete_cookie("123")
    # 4.delete_all_cookies():清除所有cookies
    driver.delete_all_cookies()
    # 5.add_cookie(cookie_dict):添加cookie的值
    cookie ={u'domain': u'.cnblogs.com',#domain:服务器域名
                u'name': u'.CNBlogsCookie',#name:cookie的名称
                u'value': u'xxxx', #value:cookie对应的值,动态生成的
                u'expiry': 1491887887,#expiry:Cookie有效终止日期
                u'path': u'/',#path:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie
                u'httpOnly': True,#httpOnly:防脚本攻击
                u'secure': False}#secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时,
                                # 浏览器才向服务器提交相应的Cookie。当前这种协议只有一种,即为HTTPS。
    driver.add_cookie(cookie)
  15. expected_conditions方法
    # expected_conditions
    # title_is: 判断当前页面的title是否完全等于(==)预期字符串,返回布尔值
    title = EC.title_is(u'百度一下')
    print title(driver)#调用call方法
    # title_contains : 判断当前页面的title是否包含预期字符串,返回布尔值
    #
    # presence_of_element_located : 判断某个元素是否被加到了dom树里,并不代表该元素一定可见
    #
    # visibility_of_element_located : 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0
    #
    # visibility_of : 跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了
    #
    # presence_of_all_elements_located : 判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,这个方法就返回True
    #
    # text_to_be_present_in_element : 判断某个元素中的text是否 包含 了预期的字符串
    result1 = EC.text_to_be_present_in_element(locator, text1)(driver)
    # text_to_be_present_in_element_value : 判断某个元素中的value属性是否 包含 了预期的字符串
    result2 = EC.text_to_be_present_in_element_value(locator2, text2)(driver)
    # frame_to_be_available_and_switch_to_it : 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False
    #
    # invisibility_of_element_located : 判断某个元素中是否不存在于dom树或不可见
    #
    # element_to_be_clickable : 判断某个元素中是否可见并且是enable的,这样的话才叫clickable
    #
    # staleness_of : 等某个元素从dom树中移除,注意,这个方法也是返回True或False
    #
    # element_to_be_selected : 判断某个元素是否被选中了,一般用在下拉列表
    #
    # element_selection_state_to_be : 判断某个元素的选中状态是否符合预期
    #
    # element_located_selection_state_to_be : 跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator
    #
    # alert_is_present : 判断页面上是否存在alert
    result = EC.alert_is_present()(driver)
    

     

  16. selenium异常

    selenium常见异常
    
    1.NoSuchElementException:没有找到元素
    
    2.NoSuchFrameException:没有找到iframe
    
    3.NoSuchWindowException:没找到窗口句柄handle
    
    4.NoSuchAttributeException:属性错误
    
    5.NoAlertPresentException:没找到alert弹出框
    
    6.lementNotVisibleException:元素不可见
    
    7.ElementNotSelectableException:元素没有被选中
    
    8.TimeoutException:查找元素超时
  17. selenium截图

    一、截图方法
    
    1.get_screenshot_as_file(self, filename)
    
    --这个方法是获取当前window的截图,出现IOError时候返回False,截图成功返回True。
    
    filename参数是保存文件的路径。
    Usage:
    driver.get_screenshot_as_file('/Screenshots/foo.png')
    
     
    
    2.get_screenshot_as_base64(self)
    
    --这个方法也是获取屏幕截图,保存的是base64的编码格式,在HTML界面输出截图的时候,会用到。
    
    比如,想把截图放到html测试报告里。
    Usage:
    driver.get_screenshot_as_base64()
    
     
    
    3.get_screenshot_as_png(self)
    --这个是获取屏幕截图,保存的是二进制数据,很少用到.
    Usage:
    driver.get_screenshot_as_png()
    
    截图单个元素
    
    element.screenshot()
    element.screenshot_as_png()
    element.screenshot_as_base64()
    或获取元素位置和大小,然后使用pillow模块截图
    print(element.location)                # 打印元素坐标
    print(element.size)                    # 打印元素大小
    
    left = element.location['x']
    top = element.location['y']
    right = element.location['x'] + element.size['width']
    bottom = element.location['y'] + element.size['height']
    
    im = Image.open('button.png')
    im = im.crop((left, top, right, bottom))
    im.save('button.png')
  18. selenium点击坐标

    ActionChains方法列表
    move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
    move_to_element(to_element) ——鼠标移动到某个元素
    move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
    
    
    
    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    
    def click_locxy(dr, x, y, left_click=True):
        '''
        dr:浏览器
        x:页面x坐标
        y:页面y坐标
        left_click:True为鼠标左键点击,否则为右键点击
        '''
        if left_click:
            ActionChains(dr).move_by_offset(x, y).click().perform()
        else:
            ActionChains(dr).move_by_offset(x, y).context_click().perform()
        ActionChains(dr).move_by_offset(-x, -y).perform()  # 将鼠标位置恢复到移动前
    
    次移动都是在上一次坐标的基础上(即坐标值是累积的),所以要移动后恢复到原位置
    
  19. TouchActions操作

    ActionChains 只是针对PC端程序鼠标模拟的一系列操作对H5页面操作时无效的,后来阅读了下selenium的文档发现TouchAction可以对移动端页面自动化操作
    
    
        double_tap(on_element)                                                #双击   
        flick_element(on_element, xoffset, yoffset, speed)         #从元素开始以指定的速度移动
        long_press(on_element)                                            #长按不释放
        move(xcoord, ycoord)                                                #移动到指定的位置
        perform()                                                                    #执行链中的所有动作
        release(xcoord, ycoord)                                             #在某个位置松开操作
        scroll(xoffset, yoffset)                                                      #滚动到某个位置
        scroll_from_element(on_element, xoffset, yoffset)         #从某元素开始滚动到某个位置
        tap(on_element)                                                             #单击
        tap_and_hold(xcoord, ycoord)                                        #某点按住
    
    
    
    
    
    # 触摸事件
    el = driver.find_element_by_id('getCheckcode')
    TouchActions(driver).tap(el).perform()

     

  20. selenium一些配置

    # coding:utf-8
    from selenium import webdriver
    
    # 加启动配置
    option = webdriver.ChromeOptions()
    option.add_argument('disable-infobars') 去掉‘Chrome正在受到自动软件的控制’提示
    
    option.add_argument('headless')  # 静默模式

     

  21. ActionChians详解

    actionchains是selenium里面专门处理鼠标相关的操作如:鼠标移动,鼠标按钮操作,按键和上下文菜单(鼠标右键)交互。
    这对于做更复杂的动作非常有用,比如悬停和拖放。
    
    actionchains也可以和快捷键结合起来使用,如ctrl,shif,alt结合鼠标一起使用
    
    当你使用actionchains对象方法,行为事件是存储在actionchains对象队列。当你使用perform(),事件按顺序执行
    
    
    ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()
    
    
    
    
    
    class ActionChains(object):
        def __init__(self, driver):
            self._driver = driver
            self._actions = []
    
        def perform(self):
            # 执行行为事件
    
        def click(self, on_element=None):
            点击:
            - 如果参数不写,那么点击的是当前鼠标位置
            - 如果参数写定位到的元素对象element,那就是点这个元素
    
        def click_and_hold(self, on_element=None):
            鼠标左键按住某个元素
            - 如果参数不写,那么点的是当前鼠标位置
            - 如果参数写定位到的元素对象element,那就是点这个元素
    
        def context_click(self, on_element=None):
            鼠标右键点击
            - 如果参数不写,那么点的是当前鼠标位置
            - 如果参数写定位到的元素对象element,那就是点这个元素
    
        def double_click(self, on_element=None):
            双击鼠标
            - 如果参数不写,那么点的是当前鼠标位置
            - 如果参数写定位到的元素对象element,那就是点这个元素
    
        def drag_and_drop(self, source, target):
            按住源元素上的鼠标左键,然后移动到目标元素并释放鼠标按钮
            - source: 按住鼠标的元素位置
            - target: 松开鼠标的元素位置
    
        def drag_and_drop_by_offset(self, source, xoffset, yoffset):
            按住源元素上的鼠标左键,然后移动到目标偏移量并释放鼠标按钮。
            - source: 按住鼠标的元素位置
            - xoffset: X 轴的偏移量
            - yoffset: Y 轴的偏移量
    
        def key_down(self, value, element=None):
            只发送一个按键,而不释放它。只应用于修饰键(控制、alt和shift)。
    
            - value: 要发送的修饰符键。值在“Keys”类中定义。
            - element: 定位的元素
            如果element参数不写就是当前鼠标的位置
    
            举个例子,按住 ctrl+c::
    
            ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()
    
        def key_up(self, value, element=None):
            # 释放按键,配合上面的一起使用
    
        def move_by_offset(self, xoffset, yoffset):
            将鼠标移动到当前鼠标位置的偏移量
    
             - xoffset: X轴 作为一个正整数或负整数移动到x偏移量
             - yoffset: Y轴 偏移,作为正整数或负整数。
    
    
        def move_to_element(self, to_element):
            鼠标悬停
            - to_element: 定位需要悬停的元素
    
    
        def move_to_element_with_offset(self, to_element, xoffset, yoffset):
            通过指定元素的偏移量移动鼠标。偏移量与元素的左上角相对
            - to_element: 定位需要悬停的元素
            - xoffset: X 轴偏移量
            - yoffset: Y 轴偏移量
    
    
        def release(self, on_element=None):
            释放一个元素上的鼠标按钮。
    
            - 如果参数不写,那么是当前鼠标位置
            - 如果参数写定位到的元素对象element,那就是这个元素.
    
        def send_keys(self, *keys_to_send):
            发送到当前焦点元素
            要发送的按键。修饰符键常数可以在“Keys”类。
       
    
        def send_keys_to_element(self, element, *keys_to_send):
            发送到定位到的元素上
            - element: 定位的元素
            - keys_to_send: 要发送的按键。修饰符键常数可以在“Keys”类。

     

  22.  

     

     

     

     

     

     

     

     

### 使用 Selenium 进行自动化测试的笔记与教程 #### 创建 WebDriver 实例并初始化环境 为了启动自动化测试流程,首先需要创建一个 `WebDriver` 的实例来控制浏览器行为。这可以通过指定目标浏览器驱动程序路径实现。 ```python from selenium import webdriver # 设置 Chrome 浏览器选项 chrome_options = webdriver.ChromeOptions() driver = webdriver.Chrome(options=chrome_options) # 访问网站 URL url = "http://example.com" driver.get(url) ``` 此段代码展示了如何配置Chrome浏览器选项以及加载特定网页地址[^4]。 #### 页面交互操作 一旦打开了所需的Web页面,则可以执行各种类型的用户模拟动作,比如填写表单字段或触发按钮点击事件: ```python # 定位用户名输入框并通过 sendKeys 方法发送字符串数据 username_field = driver.find_element_by_name('username') username_field.send_keys('admin') # 同样方法应用于密码域 password_field = driver.find_element_by_name('password') password_field.send_keys('123456') # 查找登录按钮元素并调用 click() 来提交表单 login_button = driver.find_element_by_id('submit-button') login_button.click() ``` 上述例子说明了怎样定位HTML文档中的不同组件,并对其进行相应的操作以模仿真实用户的活动。 #### 断言验证功能正确性 在编写自动化测试案例时,断言是非常重要的组成部分之一;它们用来确认应用程序的行为是否符合预期的结果。例如,在成功登录之后,可能会期望看到欢迎消息显示给已认证过的用户: ```python welcome_message = driver.find_element_by_class_name('greeting').text assert 'Welcome' in welcome_message, f"Expected a greeting but got '{welcome_message}' instead." ``` 这段Python脚本片段用于检查是否存在包含“Welcome”的问候语句,如果没有找到匹配项则抛出异常终止测试过程。 #### 清理资源释放 最后一步应当总是关闭打开的浏览器窗口并且结束所有关联进程,从而确保不会占用不必要的系统资源: ```python driver.quit() ``` 该命令会彻底销毁由webdriver管理的一切连接对象及其子线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值