zoukankan      html  css  js  c++  java
  • WebDriver API

    WebDriver 属于selenium体系中设计出来操作浏览器的一套API。

    在webdriver角度上,因他针对多种编程语言都实现了一遍这套API,所以他可以支持多种编程语言;在编程语言的角度,webdriver是python的一个用于实现web自动化的第三方库

    一、WebDriver 原理

    webdriver是按照server-client的设计模式设计的:

      server端就是remote server,可以是任意浏览器。当脚本启动浏览器后,浏览器就是remote server,他的职责就是等待client发送请求并做出响应。

      client是我们的测试代码了,代码中的一些行为(打开浏览器、跳转URL等)操作是以http请求的方式发送给被测试浏览器的(remote server)。remote server接受请求,执行相应操作并在response中返回执行状态、返回值等

    webdriver 工作流程:

      1.webdriver启动浏览器,并绑定到指定的端口。启动浏览器实例将作为webdriver的remote server

      2.client端通过commandexcuter 发送httprequest给remote server的侦听端口(通信协议:the webriver wire protocol)

      3.remote server需要依赖原声的浏览器组件(如IEDriverServer.exe、chromedriver.exe)来转化浏览器的native调用

    python提供了logging模块给运行中的应用提供了一个标准的信息输出接口:

    from selenium import webdriver
    import logging

    logging.basicConfig(level=logging.DEBUG) #此模式能捕获到客户端向服务端发送的post请求
    diver = webdriver.Ie()
    diver.get("http://www.baidu.com")

    diver.find_element_by_id("kw").send_keys("selenium")
    diver.find_element_by_id("su").click()
    diver.quit()


    C:UsersxiuAppDataLocalProgramsPythonPython36-32python.exe D:/study/besttest/XIU/logs/debug11.py
    DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51379/session {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "internet explorer"}}, "desiredCapabilities": {"browserName": "internet explorer", "version": "", "platform": "WINDOWS"}}
    DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
    DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51379/session/b13cead7-a113-4840-8a19-14b58ae3aaaf/url {"url": "http://www.baidu.com", "sessionId": "b13cead7-a113-4840-8a19-14b58ae3aaaf"}
    DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
    DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51379/session/b13cead7-a113-4840-8a19-14b58ae3aaaf/element {"using": "id", "value": "kw", "sessionId": "b13cead7-a113-4840-8a19-14b58ae3aaaf"}
    DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
    DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51379/session/b13cead7-a113-4840-8a19-14b58ae3aaaf/element/416ba0b6-a972-45c7-a25e-d37dfe5729c5/value {"text": "selenium", "value": ["s", "e", "l", "e", "n", "i", "u", "m"], "id": "416ba0b6-a972-45c7-a25e-d37dfe5729c5", "sessionId": "b13cead7-a113-4840-8a19-14b58ae3aaaf"}
    DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
    DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51379/session/b13cead7-a113-4840-8a19-14b58ae3aaaf/element {"using": "id", "value": "su", "sessionId": "b13cead7-a113-4840-8a19-14b58ae3aaaf"}
    DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
    DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51379/session/b13cead7-a113-4840-8a19-14b58ae3aaaf/element/5d135cb0-7222-4978-9d52-2950eca2b63e/click {"id": "5d135cb0-7222-4978-9d52-2950eca2b63e", "sessionId": "b13cead7-a113-4840-8a19-14b58ae3aaaf"}
    DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
    DEBUG:selenium.webdriver.remote.remote_connection:DELETE http://127.0.0.1:51379/session/b13cead7-a113-4840-8a19-14b58ae3aaaf {"sessionId": "b13cead7-a113-4840-8a19-14b58ae3aaaf"}
    DEBUG:selenium.webdriver.remote.remote_connection:Finished Request

    Process finished with exit code 0

    二、元素定位(id、name、class、tag、link、partial link、Xpath、CSS、By九种方法定位元素)

    from selenium import webdriver
    driver = webdriver.Ie()
    driver.get('http://www.baidu.com')
    # driver.find_element_by_id('kw').send_keys('selenium 自动化测试') #id定位
    # driver.find_element_by_name('wd').clear() #name定位
    # driver.find_element_by_class_name('s_ipt').send_keys('selenium') #class定位
    # driver.find_element_by_tag_name('input').clear() #--tag定位。一个界面可能会有很多相同的tag,因此此定位方法识别某个元素的概率很低,一般不单独用
    # driver.find_element_by_link_text('新闻').click() #link定位
    # driver.find_element_by_partial_link_text('《不忘初心 继续前进》').click() #对link定位的一个补充,支持通过元素标签之间的部分文本信息来定位
    #xpath定位
    # driver.find_element_by_xpath('/html/body/div[2]/div/div/div/div/form/span[1]/input').clear() #绝对路径
    # driver.find_element_by_xpath("//*[@id='kw']").send_keys('seleium2') #元素属性定位
    # driver.find_element_by_xpath("//*[@name='wd']").clear() #元素属性定位
    # driver.find_element_by_xpath("//*[@class='s_ipt']").send_keys('seleium3') #元素属性定位
    #层级与属性结合
    # driver.find_element_by_xpath("//form[@id='form']/span[1]/input").clear() #通过父元素进行定位
    #使用逻辑运算符
    # driver.find_element_by_xpath("//input[@id='kw' and @class='s_ipt']").send_keys('seleium4')

    #CSS定位
    # driver.find_element_by_css_selector('.s_ipt').send_keys('css定位-class') #通过class属性定位
    # driver.find_element_by_css_selector('#kw').send_keys('css定位-id') #通过id属性定位
    # driver.find_element_by_css_selector('input') #通过标签定位
    # driver.find_element_by_css_selector('form>span>input').click() #通过父子关系定位
    # driver.find_element_by_css_selector('form>span>input.s_ipt').click() #组合定位
    # driver.find_element_by_css_selector('form>span>input#kw').click() #组合定位
    # driver.find_element_by_css_selector('form.fm>span>input#su').click() #组合定位

    from selenium.webdriver.common.by import By
    #用by元素定位
    # driver.find_element(By.ID,"kw").send_keys('By元素定位-id')
    # driver.find_element(By.ID,"kw").clear()
    # driver.find_element(By.NAME,"wd").send_keys('By元素定位-name')
    # driver.find_element(By.NAME,"wd").clear()
    # driver.find_element(By.CLASS_NAME,"s_ipt").send_keys('By元素定位-class-name')
    # driver.find_element(By.CLASS_NAME,"s_ipt").clear()
    # driver.find_element(By.TAG_NAME,"input").send_keys("By元素定位-input")
    # driver.find_element(By.TAG_NAME,"input").clear()
    # driver.find_element(By.LINK_TEXT,"新闻").click()
    # driver.find_element(By.PARTIAL_LINK_TEXT,"新").click()
    # driver.find_element(By.XPATH,"//*[@class='bg s_btn']").click()

    三、控制浏览器

     import time

    #控制浏览器大小(设置浏览器宽800,高600)
    # driver.set_window_size(800,600)
    #控制浏览器后退、前进
    # driver.find_element_by_link_text('新闻').click()
    # driver.back() #后退
    # driver.forward() #前进
    #模拟浏览器刷新
    # driver.find_element_by_id("kw").send_keys("selenium")
    # driver.find_element_by_id("su").click()
    # time.sleep(2)
    # driver.refresh()
    # driver.quit()

    四、简单元素操作

    from selenium import webdriver
    import time
    driver = webdriver.Ie()
    # driver.get('https://login.xiu.com/')

    #clear() 清除文本
    #send_keys() 模拟按键输入
    #click() 单击元素
    #模拟走秀网登录
    # driver.find_element_by_link_text("密码登录").click()
    # driver.find_element_by_id("J_username").clear()
    # driver.find_element_by_id("J_username").send_keys("13684995613")
    # driver.find_element_by_id("J_password").clear()
    # driver.find_element_by_id("J_password").send_keys("jmy@123")
    # driver.find_element_by_id("login_Btn").click()
    # driver.quit()

    #webelement接口常用方法

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

    # driver.find_element_by_id("kw").send_keys("webelement接口常用方法")
    # driver.find_element_by_id("kw").submit() #用于提交表单
    # print(driver.find_element_by_id("kw").size) #获得输入框尺寸({'height': 22, 'width': 500})
    # print(driver.find_element_by_id("cp").text) #获得text值(©2017 Baidu 使用百度前必读 意见反馈 京ICP证030173号 京公网安备11000002000001号 )
    # print(driver.find_element_by_id("kw").get_attribute('type')) #获得元素的属性(text):id/name/type或其他任意属性
    # print(driver.find_element_by_id("kw").is_displayed()) #返回元素是否可见(True)

    五、鼠标事件

    #ActionChains类提供了一些鼠标操作的方法(右击、双击、悬浮、鼠标拖动等)
    # import time
    # from selenium import webdriver
    # from selenium.webdriver.common.action_chains import ActionChains
    # driver = webdriver.Ie()
    # driver.get("http://www.baidu.com")
    #鼠标右击操作
    # right_click = driver.find_element_by_link_text("新闻") #定位到要执行的元素
    # ActionChains(driver).context_click(right_click).perform() #执行右击操作(ActionChains()将浏览器驱动driver作为参数传入;context_click()方法用于模拟鼠标右键操作;perform()执行所有ActionChains中存储的行为)

    # 鼠标悬浮
    # above = driver.find_element_by_link_text("设置")
    # ActionChains(driver).move_to_element(above).perform()
    # time.sleep(2)
    # driver.quit()

    #鼠标双击操作
    # double_click = driver.find_element_by_id("su")
    # ActionChains(driver).double_click(double_click).perform()
    # driver.quit()

    #拖放鼠标
    # element = driver.find_element_by_id("xx")
    # target = driver.find_element_by_id("xx")
    # ActionChains(driver).drag_and_drop(element,target).perform() #在element元素上按住鼠标左键,然后移动到target元素上释放

    六、键盘事件

    #Keys()类提供了键盘上几乎所有的按键方法。
    # import time
    # from selenium import webdriver
    # from selenium.webdriver.common.keys import Keys
    # driver = webdriver.Ie()
    # driver.get("http://www.baidu.com")

    #输入框输入内容
    # driver.find_element_by_id("kw").send_keys("selenium")
    #删除一个字母
    # 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("好孩子")
    #全选输入框内容
    # driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
    #剪切输入框内容
    # driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
    #粘贴内容到输入框
    # driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')
    #通过键盘代替单击操作
    # driver.find_element_by_id("su").send_keys(Keys.ENTER)
    #F12键
    # driver.find_element_by_id("kw").send_keys(Keys.F12)
    # time.sleep(2)
    # driver.quit()

    七、获得验证码信息

    # from selenium import webdriver
    # import time
    # driver = webdriver.Ie()
    # driver.get("https://login.xiu.com/")
    # driver.find_element_by_link_text("密码登录").click()
    # time.sleep(2)
    # driver.refresh() #运维把登录页限速了,因此这里等待刷新下
    # time.sleep(2)
    # driver.find_element_by_id("J_username").clear()
    # driver.find_element_by_id("J_username").send_keys("13684995613")
    # driver.find_element_by_id("J_password").clear()
    # driver.find_element_by_id("J_password").send_keys("jmy@123")
    # driver.find_element_by_id("login_Btn").click()
    # name = driver.find_element_by_xpath(".//*[@id='logindiv']/a[1]").text
    # if name == '大熊二':
    # print("登录成功")
    # else:
    # print("登录错误")
    # driver.quit()

    八、设置元素等待

    # webdriver提供了两种类型的等待:显示等待和隐式等待
    # 1.显示等待:某个条件成立时继续执行,否则在达到最大时长时抛弃超时异常(TimeoutException)


    #2.隐式等待:通过一定的时长等待页面上某元素加载完成。如超出了设置的时长元素还未加载,则抛出NoSuchElementException异常
    # from selenium import webdriver
    # from selenium.common.exceptions import NoSuchElementException
    # from time import ctime

    # driver = webdriver.Ie()
    #设置隐式等待为10S
    # driver.implicitly_wait(10)
    # driver.get("http://www.baidu.com")
    # try:
    # print(ctime())
    # driver.find_element_by_id("kw111").send_keys("selenium")
    # except NoSuchElementException as e:
    # print(e)
    # finally:
    # print(ctime())
    # driver.quit()

    九、定位一组元素

    # from selenium import webdriver
    # driver = webdriver.Ie()
    # driver.get("http://www.baidu.com")
    # driver.find_elements_by_id()
    # driver.find_elements_by_name()
    # driver.find_elements_by_class_name()
    # driver.find_elements_by_tag_name()
    # driver.find_elements_by_link_text()
    # driver.find_elements_by_partial_link_text()
    # driver.find_elements_by_xpath()
    # driver.find_elements_by_css_selector()
    #如果只想勾选一组元素中的某一个则用pop().lick():
    # pop() 或pop(-1) 默认获取一组元素中的最后一个
    # pop(0) 默认获取一组元素中的第一个
    # pop(1) 默认获取一组元素中的第二个

    十、多表单切换

    #webdriver只能在一个页面上对元素识别和定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。
    这时就需要通过switch_to.frame()方法将当前定位的主题切换为frame/iframe表单的内嵌页面中
    switch_to.frame()默认可以直接取表单的id或name。如果iframe没有可用的id和name属性,则可以通过xpath先定位表单,然后再传给switch_to.frame()

    from selenium import webdriver
    import time
    import os

    driver = webdriver.Ie()
    file_path = 'file:///' + os.path.abspath('a.html') #自己写了一个表单内嵌的HTML
    driver.get(file_path)
    #切换到iframe(id= "if")的表单
    driver.switch_to.frame("if")
    driver.find_element_by_id("kw").send_keys("selenium")
    driver.find_element_by_id("su").click()
    #释放iframe
    driver.switchTo.defaultContent()
    time.sleep(2)
    driver.quit()

    十一、多窗口切换

    #webdriver提供了switch_to_window()的方法,实现在不同的窗口之间切换
    from selenium import webdriver
    import time
    driver = webdriver.Ie()
    driver.implicitly_wait(10)
    driver.get("http://www.baidu.com")

    sreach_window = driver.current_window_handle
    driver.find_element_by_link_text("登录").click()
    driver.find_element_by_link_text("立即注册").click()


    all_handls = driver.window_handles

    for handle in all_handls:
    if handle != sreach_window:
    driver.switch_to_window(handle)
    print('now sreach window!')
    driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys("username")
    driver.find_element_by_id("TANGRAM__PSP_3__phone").send_keys("13684995613")
    time.sleep(2)

    for handle in all_handls:
    if handle == sreach_window:
    driver.switch_to_window(handle)
    print('now sreach window!')
    driver.find_element_by_id("TANGRAM__PSP_4__closeBtn").click()
    driver.find_element_by_id("kw").send_keys("selenium")
    driver.find_element_by_id("su").click()
    time.sleep(2)
    driver.quit()

    十二、警告框处理

    #在webdriver中处理JavaScript所生成的alert、confirm、prompt,使用switch_to_alert()方法定位到alert/confirm/prompt,然后用text/accept/dismiss/send_keys等方法进行操作
    #text: 返回alert/confirm/prompt中的文字信息
    #accept() 接受现有警告框
    #dismiss() 解散现有警告框
    #send_keys(keysToSend):发送文本至警告框
    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    import time

    driver = webdriver.Ie()
    driver.implicitly_wait(10)
    driver.get("http://www.baidu.com")

    link = driver.find_element_by_link_text("设置")
    ActionChains(driver).move_to_element(link).perform()

    driver.find_element_by_link_text("搜索设置").click()

    driver.find_element_by_class_name("prefpanelgo").click()
    time.sleep(2)

    driver.switch_to_alert().accept()
    driver.quit()

    十三、上传文件

    #对于web页面的上传功能实现一般有以下两种方式:
    # 1.普通上传:普通的附件上传是将本地文件的路径作为一个值放在input标签中,通过form表单将这个值提交给服务器
    # 2.插件上传:一般是基于flash、JavaScript、ajax等技术所实现的上传功能

    # 1.send_keys实现上传

    from selenium import webdriver
    import os

    driver = webdriver.Ie()
    file_path = 'file:///' + os.path.abspath('b.html') #自己写的一个上传的HTML
    driver.get(file_path)

    driver.find_element_by_name("file").send_keys("D:\upload_file.txt")
    driver.quit()

    # 2.通过Autolt实现(略)

    十四、下载文件

    from selenium import webdriver
    import os
    driver = webdriver.FirefoxProfile()
    driver.set_preference("browser.download.folderList",2) #设置为0下载到浏览器默认下载目录,设置2可以保存到指定目录
    driver.set_preference("browser.download.manager.showWhenStarting",False) #True为显示, False不显示
    driver.set_preference("browser.download.dir",os.getcwd()) #os.getcwd()用户返回当前目录
    driver.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream") #指定要下载页面的content-type值:application/octet-stream

    driver1 = webdriver.Firefox(firefox_profile=driver)
    driver1.get("http://pypi.python.org/pypi/selenium")
    driver1.find_element_by_partial_link_text("selenium-3.6.0.tar.gz").click()
    driver1.quit()

    十五、操作cookie

    #webdriver操作cookie的方法(cookie数据是以字典的形式存放的):
    # get_cookies(): 获得所有cookie信息
    # get_cookies(name): 返回字典的key为name的cookie信息
    # add_cookie(cookie_dict): 添加cookie。“cookie_dict”指字典对象,必须有name和value值
    # delete_cookie(name,optionsString):删除cookie信息,“name”是要删除的cookie的名称,optionsString是该cookie的选项
    # delete_all_cookies(): 删除所有cookie信息

    from selenium import webdriver
    import time
    driver = webdriver.Firefox()
    driver.get("http://www.youdao.com")
    time.sleep(3)
    driver.add_cookie({"name":"key-aaaaaaa",'value':'value-aaaaaaa'})
    # time.sleep(3)
    for cookie in driver.get_cookies():
    print("%s -> %s" % (cookie['name'],cookie['value']))

    driver.quit()

    十六、调用JavaScript

    #调用JavaScript控制浏览器滚动条

    from selenium import webdriver
    import time
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    driver.set_window_size(600,600)

    driver.find_element_by_id("kw").send_keys("selenium")
    driver.find_element_by_id("su").click()
    time.sleep(2)

    #设置滚动条滚动的位置
    js = "window.scrollTo(600,450);"
    driver.execute_script(js)
    time.sleep(2)
    driver.quit()

    十七、窗口截图

    #脚本执行过程中出错时候截图保存

    from selenium import webdriver
    import time
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")

    driver.find_element_by_id("kw").send_keys("selenium")
    driver.find_element_by_id("su").click()
    time.sleep(3)
    #截取当前窗口,并指定截图图片的保存位置
    driver.get_screenshot_as_file("D:\picture\baidu_img.jpg")
    driver.quit()

    十八、验证码处理

    # 1.去掉 验证码
    # 2.设置万能验证码
    # 3.验证码识别技术
    # 4.记录cookie(通过添加cookie的方式将用户名和密码写入cookie,这样的话再次访问的时候就可以直接登录了)


    十九、选择框
    elect select = new Select(WebElement element);
    //Select select = new Select(driver.findElement(By.id("xxx")));
    //获取所有选项的方法
    select.getOptions();
    //根据索引选中对应的元素
    select.selectByIndex(index);
    //根据value值选中对应的选项
    select.selectByValue(value);
    //根据文本值选中对应的选项
    select.selectByVisibleText(text);
    //判断是不是多选的选择框返回boolean值 
    select.isMultiple();
    //取消所有的选中
    select.deselectAll();
    //获取默认选择的值
    String selectedSale=new Select(driver.findElement(By.id("sale"))).getFirstSelectedOption().getText()
  • 相关阅读:
    ftp>ls 未连接
    Error running 'run': data.userName must not be null
    Excel另存为_有些Excel打开时会出现一些提示
    23种设计模式通俗理解
    清除html中的标记,只留下文字
    将DataTable中的数据导出成Excel
    C#读取文件
    系统性能瓶颈分析
    Angularjs的My97DatePicker扩展
    Memcache修改端口
  • 原文地址:https://www.cnblogs.com/wsy0202/p/12876979.html
Copyright © 2011-2022 走看看