美文网首页
web自动化04--webdriver API操作

web自动化04--webdriver API操作

作者: minisummer | 来源:发表于2020-09-10 10:25 被阅读0次

    哈喽,大家好!我是minisummer!首先感谢您的关注!
    今天给大家分享的内容是webdriver API常用操作:浏览器操作,元素定位器,窗口切换,键盘事件,鼠标事件,滚动条事件,选择框和下拉框,弹窗事件,iframe框架切换,js脚本执行,截图操作等。

    selenium浏览器操作

    创建浏览器 访问网址 设置浏览器窗口大小 网页前进后退 关闭浏览器
    【1】浏览器最大化:maximize_window();
    【2】设置浏览器的宽、高:set_window_size(500,450);
    【3】控制浏览器后退、前进:back(),forward()
    WebElement常用方法:
    【1】clear():清除元素内容,有些输入框默认是有内容的;
    【2】send_keys():输入框输入;
    【3】click():单机元素;
    【4】text:获取元素的文本内;
    【5】get_attribute(name):获取属性值;
    【6】switch_frame:切换frame,多窗口处理,弹出框处理,下拉框处理,文件上传等;
    【7】其他:调用javascript,如一些时间控件,没有办法点击,首先调用js把禁止输入属性去掉,再调用js直接在输入框输入内容,就可以选择时间;还有一个拖动浏览器滚动条,有时候一些操作和按钮在页面下方,在页面没有显示出来,自动化就无法操作,这时候就需要控制浏览器滚动条。

    from selenium import webdriver
    
    # 实例化谷歌浏览器对象
    driver = webdriver.Chrome()
    # 访问百度
    driver.get('http://www.baidu.com')
    # 获取当前网页url
    print(driver.current_url)
    # 获取当前网页源码
    print(driver.page_source)
    # 获取当前页面title
    print(driver.title)
    # 获取测试浏览器名称
    print(driver.name)
    
    # 刷新页面
    driver.refresh()
    # 设置浏览器宽高
    driver.set_window_size(200,200)
    
    # 设置浏览器最小化
    driver.minimize_window()
    # 设置浏览器全屏
    driver.maximize_window()
    # 设置网页前进
    driver.forward()
    driver.get('http://www.jd.com')
    # 获取浏览器句柄
    print(driver.current_window_handle)
    # 获取浏览器所有句柄
    print(driver.window_handles)
    
    print(driver.title)
    # 设置网页后退
    driver.back()
    # 关闭标签页
    driver.close()
    # 关闭浏览器并结束进程
    driver.quit()
    

    selenium 定位器

    元素十大定位
    id、name、class name、tag name、link text/partial link text、xpath、css等定位方法。
    find_element_by_id();
    find_element_by_name();
    find_element_by_class_name();
    find_element_by_tag_name();
    find_element_by_link_text();
    find_element_by_partial_link_text();
    find_element_by_xpath();
    find_element_by_css_selector()
    操作元素:
    输入框,下拉框,按钮点击,文件上传、下载,分页,对话框,警告框等操作方法。

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    
    # 根据id定位元素,clear()清空文本信息,send_keys()输入文本信息
    driver.find_element_by_id('kw').clear()
    driver.find_element_by_id('kw').send_keys('selenium自动化测试')
    # 根据name定位元素
    # driver.find_element_by_name('wd').send_keys('selenium自动化测试')
    # # 根据class_name定位元素
    # driver.find_element_by_class_name('s_ipt').send_keys('selenium自动化测试')
    # # 根据tag_name定位元素
    # driver.find_element_by_tag_name('input#kw.s_ipt').send_keys('selenium自动化测试')
    # # 根据xpath定位元素
    # driver.find_element_by_xpath('//*[@id="kw"]').send_keys('selenium自动化测试')
    # # 根据css选择器定位元素
    # driver.find_element_by_css_selector('#kw').send_keys('selenium自动化测试')
    # # 根据link_text定位元素,click()点击操作
    # driver.find_element_by_link_text('新闻').click()
    # # 根据partial_link_text定位元素
    # driver.find_element_by_partial_link_text('新').click()
    # # 层级定位,先定位父级再定位子级,可以分开写也可以写作一行
    # father = driver.find_element_by_id('form')
    # father.find_element_by_id('kw').send_keys('selenium自动化测试')
    # driver.find_element_by_id('form').find_element_by_id('kw').send_keys('selenium自动化测试')
    # # 定位一组元素,element改用复数elements,通过索引获取一个元素
    # driver.find_elements_by_id('s-top-left')[0].click()
    
    #关闭标签页
    driver.quit()
    

    selenium多窗口切换

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    # 根据link_text定位元素,click()点击操作
    driver.find_element_by_link_text('新闻').click()
    
    # 第一种方法(简单性能好):打开多个窗口,需要定位到最新打开的窗口
    # 获取打开的多个窗口句柄
    windows = driver.window_handles
    # 切换到当前最新打开的窗口
    driver.switch_to.window(windows[-1])
    
    # 第二种方法(常用易理解):打开两个窗口,需要定位到新的窗口
    # 获取打开的第一个窗口句柄
    windows_1 = driver.current_window_handle
    # 获取打开的所有窗口句柄
    windows = driver.window_handles
    # 切换为最新的窗口
    for current_window in windows:
        if current_window != windows_1:
            driver.switch_to.window(current_window)
    

    selenium鼠标操作

    ActionChains类:所有的鼠标操作最后都要带上perform()方法

    from selenium.webdriver.common.action_chains import ActionChains
    from selenium import webdriver
    from time import sleep
    
    
    driver = webdriver.Chrome()
    driver.get("https://www.baidu.com")
    driver.maximize_window()
    
    # 获取Baidu搜索框元素对象
    element = driver.find_element_by_css_selector("#kw")
    # 输入关键词“Python自动化”
    element.send_keys("Python自动化")
    sleep(3)
    
    # 执行双击鼠标的操作(实现选中输入框中的部分关键词)
    ActionChains(driver).double_click(element).perform()
    sleep(2)
    
    # 执行右击鼠标的操作(实现弹出操作选项)
    ActionChains(driver).context_click(element).perform()
    sleep(2)
    
    # 执行鼠标移动悬停的操作(实现定位到悬停的元素,或js交互效果)
    above = driver.find_element_by_css_selector(".pf")
    # 实例化ActionChains类对象,传入driver初始化,对象调用move_to_element()
    ActionChains(driver).move_to_element(above).perform()
    sleep(2)
    
    # 将source元素拖拽到target元素位
    ActionChains(driver).drag_and_drop(above, target).perform()
    
    driver.quit()
    

    selenium 键盘事件

    使用Keys类

    from selenium.webdriver.common.keys import Keys
    from selenium import webdriver
    from time import sleep
    
    driver=webdriver.Chrome()
    driver.get('https://www.baidu.com')
    
    
    element = driver.find_element_by_id('kw')
    # 模拟键盘实现空格键操作
    element.send_keys(Keys.SPACE)
    # 模拟键盘实现删除一个字符操作
    element.send_keys(Keys.BACK_SPACE)
    # 模拟键盘实现tab键操作
    element.send_keys(Keys.TAB)
    # # 模拟键盘实现退出键操作
    # element.send_keys(Keys.ESCAPE)
    # # 模拟键盘实现回车键操作
    # element.send_keys(Keys.ENTER)
    # # 模拟键盘实现F1键操作
    # element.send_keys(Keys.F1)
    
    # 在搜索框输入关键字'selenium自动化测试'
    element.send_keys('selenium自动化测试')
    
    # 模拟键盘实现全选操作【Ctrl+A】
    element.send_keys(Keys.CONTROL,'a')
    element.send_keys(Keys.CONTROL,'c')
    element.send_keys(Keys.CONTROL,'x')
    element.send_keys(Keys.CONTROL,'v')
    element.send_keys(Keys.CONTROL,'a')
    
    sleep(3)
    
    # 模拟键盘实现复制操作【Ctrl+A】、剪切操作【Ctrl+X】
    
    element.send_keys(Keys.CONTROL,'c')
    sleep(3)
    # element.send_keys(Keys.CONTROL,'X')
    # sleep(3)
    # 打开Sogou搜索首页
    driver.get("https://www.sogou.com")
    sleep(3)
    # 获取Sogou搜索框元素对象
    elementSg = driver.find_element_by_id('query')
    sleep(3)
    # 模拟键盘实现粘贴操作【Ctrl+V】,粘贴所复制的内容到Sogou搜索框
    elementSg.send_keys(Keys.CONTROL,'V')
    sleep(3)
    # 点击Sogou搜索框的搜索按钮,实现Sogou搜索关键词的效果
    driver.find_element_by_id('stb').click()
    sleep(3)
    
    driver.quit()
    

    selenium元素等待

    强制等待
    不管程序是否加载完成,程序都必须等待设定的时间。
    显式等待
    (直到元素出现才去操作,超时则报异常)明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到就抛出Exception
    隐式等待
    在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。

    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
    from time import sleep
    
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com')
    # 强制等待:傻傻的等待3秒钟,不管是否提前结束
    sleep(3)
    
    # 隐式等待:等待3秒钟,若提前结束就停止等待,若超时就抛出异常
    driver.implicitly_wait(3)
    
    # 显式等待
    # WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
    # 浏览器驱动;最长超时时间,秒为单位;检测时间间隔,默认是0.5秒;超时后的异常信息,默认抛NoSuchElementException;一般和until和until_not配合使用
    element = WebDriverWait(driver,5,0.5).until(
        EC.presence_of_element_located((By.ID,'kw'))
    ) # 等待5秒钟,每隔0.5秒钟询问一次,直到出现id为kw的元素
    element.send_keys('selenium自动化测试')
    
    # # 用于判断标题是否 xx
    # title_is
    # # 用于判断标题是否包含 xx 信息
    # title_contains
    # # 元素是否存在
    # presence_of_element_located
    # # 元素是否可见
    # visibility_of_element_located
    #  # 是否可见
    # visibility_of
    # # 判断一组元素的是否存在
    # presence_of_all_elements_located
    # # 判断元素是否有 xx 文本信息
    # text_to_be_present_in_element
    #  # 判断元素值是否有 xx 文本信息
    # text_to_be_present_in_element_value
    # # 框架是否可用,并切换到该框架
    # frame_to_be_available_and_switch_to_it
    # # 判断元素是否隐藏
    # invisibility_of_element_located
    #  # 判断元素是否点击,它处于可见和启动状态
    # element_to_be_clickable
    #  # 等到一个元素不再是依附于 DOM
    # staleness_of
    # #被选中的元素
    # element_to_be_selected
    # # 一个期望的元素位于被选中
    # element_located_to_be_selected
    # # 一个期望检查如果给定的元素被选中
    # element_selection_state_to_be
    # # 期望找到一个元素并检查是否选择状态
    # element_located_selection_state_to_be
    # # 预期一个警告信息
    # alert_is_present
    
    print(driver.title)
    driver.quit()
    

    selenium单选框操作

    from selenium import webdriver
    
    driver=webdriver.Chrome()
    driver.get('http://localhost:89/web.html')
    
    # 层级定位
    radio=driver.find_element_by_id('s_radio')
    t=radio.find_elements_by_name('teacher')
    t[0].click()
    
    driver.quit()
    

    selenium多选框操作

    from selenium import webdriver
    driver=webdriver.Chrome()
    driver.get('http://localhost:89/web.html')
    
    check=driver.find_element_by_id('s_checkbox')
    
    t=check.find_elements_by_name('teacher')
    for i in range(0,len(t)):
        if not t[i].is_selected():
            t[i].click()
    
    driver.quit()
    

    selenium下拉框操作

    from selenium import webdriver
    from selenium.webdriver.support.select import Select
    
    driver=webdriver.Chrome()
    driver.get('http://localhost:89/web.html')
    
    # 定位到下拉框
    s=driver.find_element_by_id('s_single')
    # 通过索引进行选择
    # Select(s).select_by_index(0)
    # 通过可见的文本进行选择
    # Select(s).select_by_visible_text('王小五')
    # 通过value值进行选择
    Select(s).select_by_value('赵学生')
    
    # 取消所有下拉选择
    Select(s).deselect_all()
    
    driver.quit()
    

    selenium弹窗操作

    alert框:只有一个确认按钮
    confirm框:有确定与取消按钮
    参考文章:https://www.cnblogs.com/wanshuang/p/12513177.html

    iframe框架切换

    1.先定位到第一个元素
    2.使用格式switch_to.frame()方法转到frame再定位
    3.回到原来的第一个主页面中使用:switch_to.default_content()

    # 切换到id为'iframe'的框架
    driver.switch_to.frame('iframe')
    # 切回默认框架
    driver.switch_to.default_content()
    

    selenium文件上传

    如果不是input标签,则需要借助autoit3工具来上传文件。

    # 相对于该py文件的图片对象
    file = os.path.abspath('1.png')
    #如果是input标签,则可以使用send_keys直接上传,将图片传入id为upfile的元素里
    driver.find_element_by_id('upfile').send_keys(file)
    

    selenium滚动条操作

    scroll函数用法:
    --scrollHeight 获取对象的滚动高度。
    --scrollLeft 设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离。
    --scrollTop 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离。
    --scrollWidth 获取对象的滚动宽度

    from selenium import webdriver
    from time import sleep
    
    class ShopxoScroll:
    
        def __init__(self):
            self.driver = webdriver.Chrome()
            self.driver.get('https://guest.shopxo.net/admin.php')
            self.driver.maximize_window()
    
        def login(self):
            # 用户名
            self.driver.find_element_by_name('username').send_keys('shopxo')
            # 密码
            self.driver.find_element_by_name('login_pwd').send_keys('shopxo')
            # 登录
            self.driver.find_element_by_class_name('am-btn').click()
            # 点击商品管理
            self.driver.find_elements_by_class_name('nav-name')[15].click()
            self.driver.find_elements_by_class_name('nav-name')[16].click()
            # 滚动到底部
            js1 = "document.getElementById('admin-offcanvas').scrollTop=10000"
            # 执行编写好的js代码
            self.driver.execute_script(js1)
            sleep(3)
            print('等待3秒......')
    
            # 先定位frame,然后切入到frame中
            frame_goods = self.driver.find_element_by_id('ifcontent')
            self.driver.switch_to.frame(frame_goods)
            print('已经切换到iframe')
            # 垂直滚动到底部
            js2 = "document.documentElement.scrollTop=10000"
            self.driver.execute_script(js2)
            print('垂直滚动执行了......')
    
            sleep(3)
            # 水平滚动到右侧
            data = self.driver.find_element_by_id('data-list-3')
            goods_name = data.find_element_by_class_name('am-nowrap-initial').text
            print(goods_name)
            js3 = "document.getElementsByClassName('am-scrollable-horizontal')[0].scrollLeft=10000"
            self.driver.execute_script(js3)
            print('水平滚动执行了.....')
    
            # 跳出frame
            self.driver.switch_to.default_content()
    
            chakan = self.driver.find_element_by_xpath('//*[@id="data-list-3"]/td[9]/p/span')
            print(chakan)
            sleep(3)
    
        def close(self):
            self.driver.quit()
    
    
    if __name__ == '__main__':
        admin = ShopxoScroll()
        admin.login()
        admin.close()
    

    selenium截图操作

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com')
    # 将当前页面可视区截图并存放命名为baidu.jpg
    driver.get_screenshot_as_file("baidu.jpg")
    

    请大家多多指教~
    以上内容希望对你有帮助,有被帮助到的朋友欢迎点赞,评论。
    注:转载请注明出处,商用请征得作者本人同意,谢谢!!!

    相关文章

      网友评论

          本文标题:web自动化04--webdriver API操作

          本文链接:https://www.haomeiwen.com/subject/cyjifktx.html