• selenium定位元素方法汇总


    #打开网页前三步
    from selenium import webdriver
    driver=webidriver.Chrome()
    driver.get("https://www.baidu.com")
     
    #设置休眠时间
    import time
    time.sleep(2)
     
    #刷新页面
    driver.refresh()
     
    #页面切换
    driver.back()#返回上一页
    driver.forward()#切换到下一页
     
    #设置窗口大小
    driver.set_window_size(540,960)  #设置窗口的具体尺寸
    driver.maximize_window()  # 最大化窗口
     
    #截屏
    driver.get_screemshot_as_file("D:\test\b1.jpg")
     
    #退出
    driver.close()#关闭当前窗口
    driver.quit()#退出浏览器进程
     
    #元素定位方法
    find_element_by_id("").send_keys("输入的文本")
    find_element_by_name("").click()
    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(".//*[@id='kw']")#绝对定位
    find_element_by_css_selector()#css定位
     
    #复数定位,就是将element变成elements的形式,复数形式
    find_element_by_xpath("//*[@name='wd']")#用name值定位
    find_element_by_xpath("//*[@class='s_ipt']")#用class值定位
    find_element_by_xpath("//*[@autocomplete='off']")#用其他属性定位元素,*表示任意标签,也可以将*换成input等别的标签
     
    #层级定位
    driver.find_element_by_xpath("//span[@id='kd']/input")#父子层级定位
    driver.find_element_by_xpath("//span[@id='ke']/span/input")#三层层级定位
     
    #xpath索引
    driver.find_element_by_xpath("//select[@id='nr']/option[1]")#option后边的中括号是索引,从1开始
     
    #xpath的逻辑运算 and or not
    driver.find_element_by_xpath("//*[@id='kw'and @autocomplete='off']")#and逻辑,两个同时满足时才能定位到某一个元素
     
    #xpath模糊匹配定位,包含,以什么开始
    driver.find_element_by_xpath("//*[contains(test(),'hao123')]")#文本中包含
    driver.find_element_by_xpath("//*[contains(@id,'kw')]")
    driver.find_element_by_xpath("//*[starts-with(@id,'s_kw')]")#以什么开始
    driver.find_element_by_xpath("//*[ends-with(@id,'kw-wrap')]")#以什么结尾
    driver.find_elment_by_xpath("//*[matchs(text(),'hao13')]")#正则表达式
     
    #css属性定位,
    #id用#开头表示、class用点.开头表示、标签无任何表示符
    driver.find_element_by_css_selector("#kw")#用id定位
    driver.find_element_by_css_selector(".s_ipt")#用class定位
    driver.find_element_by_css_selector("input")#用标签定位元素
    driver.find_element_by_css_selector("[name='wd']")#用name值属性定位
    driver.find_element_by_css_selector("[autocomplete='of']")#用其他属性定位
    driver.find_element_by_css_selector("[type='text']")
     
    #css标签与属性组合来定位元素
    driver.find_element_by_css_selector("input#kw")#中间不用空格
    driver.find_element_by_css_selector("input[id='kw']")
    driver.find_element_by_css_selector("input.s_ipt")
    driver.find_element_by_css_selector("input:contains('kw')")

    # css层级关系
    driver.find_element_by_css_selector("form#form>span>input").send_keys("python")
    driver.find_element_by_css_selector("form.fm>span>input").send_keys("python")
     
    # css索引
    driver.find_element_by_css_selector("selector#nr>option:nth-child(1)").click()
     
    # css逻辑运算 不需要写and
    driver.find_element_by_css_selector("input[id='kw'][name='wd']")
     
     
    # css模糊匹配
    contain语法已经被抛弃
     
    # seleniumBuilder辅助定位元素
    下载seleniumBuilder
    工具—>web开发者—>launch selenium builder
     
     
    # 操作元素(键盘和鼠标事件)
    鼠标左键:.click()
    清空输入框:driver.clear()
    输入字符串:.send_keys() 发送中文需要在前面加u,如u“中文”
    提交表单:.submit() 一般用于模拟回车键
     
    ##键盘操作
    需要先导入模块:from selenium.webdriver.common.keys import Ksys
    模拟enter键:send_keys(Keys.ENTER)
    如:driver.find_element_by_id("search_term").send_keys(Keys.ENTER)
    send_keys(Keys.F1) #可以设置F1-F12
    send_keys(Keys.CONTROL,'c')#模拟复制Ctrl+C的组合键
    send_keys(Keys.TAB)
     
    ##鼠标悬停事件
    需要先导入模块:from selenium.webdriver.common.action_chains import ActionChains
    .perform()执行所有ActonChains中的行为
    move_to_element()鼠标悬停
     
    如:
    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    driver = webdriver.Firefox()
    driver.get("https://www.baidu.com")
    driver.implicitly_wait(10)#设置等待时间
    mouse = driver.find_element_by_link_text("设置")
    ActionChains(driver).move_to_element(mouse).perform()#执行以上所有的ActionChains中的行为
     
     
    右击鼠标:context_click()
    双击鼠标:double_click()
     
    #多窗口、句柄(handle)
    driver.current_window_handle #获取当前页面的句柄
    driver.window_handles #获取当前所有的句柄
    #切换句柄
    方法一:
    1.循环判断是否与首页句柄相等
    2.如果不等,说明是新页面的句柄
    3.获取的新页面的句柄后,可以切换到新打开的页面上
    4.打印新页面的title,看是否切换成功
    for i in all_h:
    if i ! = h:
    driver.switch_to.window(i)
    print driver.title
    方法二:
    1.直接获取all_h这个list数据里面的第二个hand的值:all_h[1]
    driver.switch_to.window(all_h[1])
    print driver.title
     
    # 关闭新窗口,切回主页
    close是关闭当前窗口
    quit是退出整个进程
    driver.switch_to.window(h)#切换到首页句柄
     
    # 定位一组元素 find_elements
    如果一组元素,他们的父元素是一样的,就可以定位一组元素
    s=driver.find_elements_by_css_selector("h3.t>a")
    for i in s:
    print i.get_attribute("href")#获取href属性,打印URL地址
     
    # 随机函数
    导入随机函数:import random
    设置随机值为0-9 a=random.randint(0-9)
    如:
    import random
    t=random.randint(0,9)
    print(t)
     
    # 随机打开URL
    s=driver.find_elements_by_css_selector("h3,t>a")#定位到一组有相同父级的元素
    a=s[t].get_attribute("href")#获取href属性
    print a #打印URL地址
    driver.get(a) #获取这个随机获取的URL地址
     
    s[t].click()#随机取一个结果点击鼠标
     
    # iframe切换
    switch_to_frame
    driver.switch_to_frame("id-name")#这个语法现在已经过时
    driver.switch_to.frame("id-name")#现在的语法是这样的#切换iframe 然后定位iframe里面的内容
    #如果iframe中没有id,需要先定位iframe
    如:
    iframe=driver.find_element_by_tag_name("iframe")
    driver.switch_to.frame(iframe)
    然后在定位iframe里面的其他内容
    #释放iframe
    driver.switch_to_default_content() #返回主页面
     
    #如何判断元素是否在iframe上
    1.定位到元素后,切换到firepath界面
    2.看firebug工具左上角,如果现实top window说明没有iframe
    3.如果显示iframe#。。。这样的,说明在iframe上,#后面就是它的id
    #select下拉框
    先定位select框,在定位select里面的选项
    s=driver.find_element_by_id("nr")#定位select框
    s.find_element_by_xpath("//option[@value='50']").click() #定位select里面的50那个选项
     
    #也可以合成写在一起
    driver.find_element_by_id("nr").find_element_by_xpath("//option[@value='50']").click()
    #直接用xpath定位
    driver.find_element_by_xpath(".//*[@id='nr']/option[2]").click()
     
    # select模块(index)
    导入select方法:
    from selenium.webdriver.support.select import Select
    然后通过select选项的索引来定位select_by_index(2),从0开始计数
     
    driver.find_element_by_id("nr")
    Select(s).select_by_index(2)
     
     
    # select模块(value)
    select_by_value("20")
    s=driver.find_element_by_id("nr")
    Select(s).select_by_value("20")
     
    # select模块(text)
    select_by_visible_text("每页显示50条")
    s=driver.find_element_by_id("nr")
    Select(s).select_by_visible_text("每页显示50条")
     
    #select模块更多的定位方法
    select_by_index() #通过索引定位
    select_by_value() #通过value值定位
    select_by_visible_text() #通过文本值定位
    deselect_all() #取消所有选项
    deselect_by_index() #奇效对应的index选项
    deselect_by_value() #取消对应的value选项
    deselect_by_visible_text() #取消对应文本选项
    first_selected_option() #返回第一个选项
    all_selected_options() #返回所有的选项
     
    # alert、confirm、prompt
    alert——警示框,只有确认按钮,点击消失
    confirm——询问框,有确认和取消按钮
    prompt——需要输入文本,有确定和取消按钮
     
    text:获取文本值
    accept():点击“确认”
    dismiss():点击“取消”或者叉掉对话框
    send_keys(): 输入文本值-仅限于prompt。在alert和confirm上没有输入框
     
    #定位alert操作
    1.先用switch_to_alert()切换到alert弹出框上
    2.可以用text方法获取弹出的文本信息
    3.accept()点击确认按钮
    4.dismiss()相当于点击右上角x,取消弹出框
    如:
    driver.find_element_by_id("alert").click()#定位到警示框
    driver.find_element_by_id("confirm").click()
    driver.find_element_by_id("prompt").send_keys("xxxx")
    t=driver.switch_to.alert() #定位弹出的alert警示框
    print t.text() #打印alert文本
    t.accept() #点击确定按钮
    t.dismiss() #叉掉警示框
     
    ###select遇到的坑
    1.操作百度设置里面,点击“保存设置”按钮时,alert弹出框没有弹出来。
    2.分析原因:经过慢慢调试后发现,在点击“保存设置”按钮时,由于前面的select操作后,失去了焦点
    3.解决办法:在select操作后看,做个click()点击操作
     
    s=driver.find_element_by_id("nr")
    Select(s).select_by_visible_text("每页显示20条")
    time.sleep(3)
    s.click()
     
     
    ###单选框和复选框(radiobox、CheckBox)
     
    直接用id定位就可以
    driver.find_element_by_id("c1").click()
    ##全部勾选,可以用到定位一组元素,find_elements是不能直接点击的,它是复数,只能先获取所有的CheckBox对象,然后通过for循环去一个个点击操作
     
    driver.find_elements_by_xpath(".//*[@type='checkbox']")
    for i in checkboxs:
    i.click()
     
    ### 判断是否选中:is_selectd()
    有的默认选项,本身就是选中状态,如果再点一下,就反选了。
    s=driver.find_element_by_id("boy").is_selected()#没点击操作前,判断选项框状态
    print s
    driver.find_element_by_id("boy").click()
     
    r=driver.find_element_by_id("boy").is_selected()
    print r
     
    #table定位
    用xpath .//*[@id='mytable']/tbody/tr[2]/td[1]
    可以打印表格内容
    t=driver.find_element_by_xpath(".//*[@id='mytable']/tbody/tr[2]/td[1]")
     
    print t.text
     
    ## 加载Firefox配置
    就是要调出下载的firebug的配置
    需要用FirefoxProfile(profile_directory)这个类来加载,括号内的profile_directory为浏览器配置文件的路径地址
    ####了解selenium里面的API用法,先看下相关的帮助文档,打开cmd窗口,输入以下命令
    python
    from selenium import webdriver
    help(webdriver.FirefoxProfile)
    #####profile_directory查找Firefox配置文件地址
    打开Firefox右上角的设置——>帮助——>故障排除信息——>显示文件夹——>复制路径 就是Firefox的配置文件地址
    路径存在字符,转义字符,为了不让转义,前面加,或者字符串前面加r。
    如:profile_directory=r'c:users....'
    profile=webdriver.FirefoxProfile(profile_directory)#加载配置地址
     
    driver=webdriver.Firefox(profile) #启动浏览器配置
     
     
    ## 富文本
    如:博客园的新随笔,这里有个iframe,定位iframe,send_keys()就可以输入内容了,有时候输入不成功,可以在输入之前先按个table键,send_keys(Keys.TAB)
    edittile = u'selenium2+python自动化-富文本 标题'
    editbody = u '这里是发帖的正文'
    driver.find_element_by_id("editor_edit_txbtitle").send_keys(edittile)#输入标题
    driver.switch_to.frame("Editor_Edit_EditorBody_ifr") #定位富文本所在的iframe
    driver.find_element_by_id("tinymce").send_keys(Keys.TAB)#输入文本之前先按一下tab键
     
    driver.find_element_by_id("tinumce").send_keys(editbody) #输入富文本的内容
     
     
    ###文件上传(send_keys)
    web页面文件上传,分两个场景:
    1.input,用selenium提供的send_keys()方法轻松解决
    以博客园为例:
    driver.find_element_by_css_selector("img.mceIcon").click() #点开编辑器图片
    time.sleep(3)
    iframe = driver.find_element_by_tag_name("iframe")[1] #定位所有iframe,取第二个
    driver.switch_to_frame(iframe) #切换到iframe上
    driver.find_element_by_name("file").send_keys(r"D:\test...14.png")
     
    2.非input,比较困难,可以借助autoit工具,或者SendKeys第三方库
     
     
     
    ###获取元素属性
    *获取title方法:dirver.title
    *获取元素的文本:driver.text
    *获取元素的标签:driver.tag_name
    *获取元素的其他属性:driver.get_attribute("属性名") 可以是class,name等,如:driver.get_attribute("class"),driver.get_attribute("name")
     
    *获取输入框内的文本值:driver.get_attribute("value")
     
    *获取浏览器名称:driver.name
     
    ###爬页面源码(page_source)
    driver.page_source
    page = driver.page_source
    print page
    **re非贪婪模式
    需要导入re模块,用re的正则匹配,findall方法返回的是一个list集合,匹配出来之后发现有一些不是URL链接,可以筛选下
    #非贪婪匹配,re.s('.'匹配字符,包括换行符)
    url_list = re.findall('href="(.*?)"',page,re.s)
    for url in url_list:
    print url
     
    #筛选url地址出来
    加个if语句判断,‘http’在url里面说明是正常的url地址了,把所有的url地址放到一个集合里面。
    url_list = re.findall('href="(.*?)"',page,re.s)
    url_all = []
    for url in url_list:
    if "http" in url:
    print url
    url_all.append(url)
    #最终的url集合
    print url_all
     
     
    ###cookie 相关操作
    登录有图形验证码,可以通过绕过验证码的方式,添加cookie方法登录。登录后换账号登录的时候,也可作为后置条件去删除cookie然后下个账号登录。
     
    *获取cookie:get_cookies()
    第一次打印出来cookie是空,打开网页后,重新获取cookie,打印出来就有值了。
     
    from selenium import webdriver
    import time
    driver = webdriver.Firefox()
    #启动浏览器后获取cookies
    print driver.get_cookies()
    driver.get("http://www......")
    #打开主页后获取cookies
    print driver.get_cookies()
     
    **登录后的cookies和登录前的不一样,name和value值发生了变化。
     
    ##获取指定name的cookie::driver.get_cookie(name)
    如:dirver.get_cookie(xxxx = "cookie-name")
    ##清除指定的cookie: delete_cookie()
     
    ##清除所有cookies::delete_all_cookies()
     
    ###总结cookie操作的几个方法:
    1.get_cookie():获取所有cookies
    2.driver.get_cookie(name)::获取指定name的cookie:
    3.清除指定cookie::delete_cookie()
    4.清除所有的cookies::delete_cookies()
    5.add_cookie(cookie_dict):添加cookie的值,可以绕过验证码登录
     
    ####绕过验证码登录(add_cookie)
    先手动登录一次,用fiddler抓包,住区这个cookie,点击登录之前的cookie,和登录之后的cookie,添加cookie,driver.add_cookie(cookie_dict),这里添加的是字典的格式
     
    ####cookie组成结构
    cookie = { u'domain':u'xxxxxx.com',#服务器域名
    u'name':u'xxxxxxcookie',##cookie的名称
    u'value':u'xxxxx',#cookie对应的值,动态生成
    u'expiry':14843958349,#cookie有效终止日期
    u'path':u'/', #path属性定义了web服务器上哪些路径下的页面可获取服务器设置的cookie。
    u'httpOnly':True, #防脚本攻击
    u'secure':False } #在cookie中标记该变量,表明只有当浏览器和web server之前的通信协议为加密认证协议时,浏览器才向服务器提交相应的cookie。当前这种协议只有一种,即为https。
     
    c1={ u'domain':u'xxxxxx.com',
    u'name':u'xxxxxxcookie',
    u'value':u'xxxxx',
    u'expiry':14843958349,
    u'path':u'/',
    u'httpOnly':True,
    u'secure':False
    }
    driver.add_cookie(c1) #添加c1
    driver.refresh()#添加完需要刷新,才能生效
    注意事项:
    1.登录时候要勾选自动登录按钮
    2.add_cookie()只添加name和value,有时候是登录不成功的。
    3.这种方法不适合所有网站,一般像这种记住登录状态的才适合。
     
    ##JS处理滚动条
    selenium操作js的方法:execute_script(),可以直接执行js脚本。
    http:www.w3school.com/js/index.asp4 js学习网站
     
    ***控制滚动条高度:
    1.滚动条回到顶部:
    js="var q=document.getElementById('id').scrollTop=0"
    driver.execute_script(js)
    2.滚动条拉倒底部
    js="var q=document.documentElement.scrollTop=10000"
    driver.execute_script(js)
    *scrollTop值,0是最上面,10000是最底部。
     
    ***横向滚动条
    scrollTo(x,y)js="window.scrollTo(100,400)"
    driver.execute_script(js)
    x——横向距离,y——纵向距离。
    ***但是对于Chrome浏览器不起作用,可以用一下方法解决
    js = "var q=document.body.scrollTop=0" #document后边换成body就可以了。
    driver.execute_script(js)
     
    ####元素聚焦
    每次打开的页面不一样,元素所在的位置也不一样的情况。直接跳到元素出现的位置。
    target = dirver.find_element_by_xxx()
    driver.execute_script("arguments[0].scrollIntoView();",target)
     
    **获取浏览器名称
    driver.name
     
    ### 兼容性,兼容所有浏览器
    #回到顶部
    def scroll_top():
    if driver.name =="chrome":
    js = "var q=document.body.scrollTop=0"
    else:
    js = "var q=document.documentElement.scrollTop=0"
    return driver.execute_script(js)
     
    #拉倒底部
    def scroll_foot():
    if driver.name =="chrome":
    js = "var q=document.body.scrollTop=10000"
    else:
    js = "var q=document.documentElement.scrollTop=10000"
    return driver.execute_script(js)
     
    ### scrollTo 函数
    scrollTo 不存在兼容的问题
    ——scrollHeight 获取对象的滚动高度
    ——scrollLeft 设置或获取位于对象左边界和窗口中目前可见内容的最左边之间的距离
    ——scrollTop 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离
    ——scrollWidth 获取对象的滚动宽度
     
    #滚动到底部
    js = "window.scrollTo(0,document.body.scrollHeight)"
    driver.execute_script(js)
     
    #滚动到顶部
    js = "window.scrollTo(0,0)"
    driver.execute_script(js)
     
     
    ####js处理富文本
    1.加载配置
    2.打开编辑界面
    3.定位iframe
    4.定位到iframe之后,用js方法直接输入,无需切换iframe
    5.直接点击保存按钮,无需再切回来
    如:
    body = "js的正文内容"
    js ='document.getElementById("Editor_Edit_EditorBody_ifr").contentWindow.document.body.innerHTML ="%s"' % body
    driver.execute_script(js)
     
    #保存草稿
    driver.find_element_by_id("Editor_Edit_lkbDraft").click()
     
    #### js处理日历控件(修改readonly属性)
    日历输入框的属性是:readonly="readonly"
    ***用js去掉readonly属性
    1.先定位到元素,然后用removeAttribute("readonly")方法删除属性
    2.出发日期元素id为:train_date,对应js代码为:
    'document.getElementById("train_date").removeAttribute("readonly");'
    如:
    #去掉元素的readonly属性
    js='document.getElementById("train_date").removeAttribute("readonly");'
    driver.execute_script(js)
     
    3先清空文本,再输入日期;
    driver.find_element_by_id("train_date").clear()
    driver.find_element_by_id("train_date").send_keys("2016-12-25")
     
    ***改输入框元素的value值输入日期
    js='document.getElementById("train_date").removeAttribute("readonly");'
    driver.execute_script(js)
    #用js方法输入日期
    js_value = 'document.getElementById("train_date").value="2016-12-25"'
    driver.execute_script(js_value)
     
    ###js处理内嵌div滚动条
    js1 = 'document.getElementById("id-name").scrollTop=10000' #纵向滚动条拉到最底端,用id定位
    driver.execute_script(js1) #运行js代码
     
    #纵向顶部
    js1 = 'document.getElementById("id-name").scrollTop=0'
     
    driver.execute_script(js1)
     
    #横向滚动条
    js3 = 'document.getElementById("id-name").scrollLeft=10000'
    js3 = 'document.getElementById("id-name").scrollLeft=0'
    driver.execute_script(js4)
     
    ##用class属性定位
    js用class属性定位,返回的是一个list对象,这里取第一个就可以了。
    js5 = 'document.getElementsByClassName("scroll")[0].scrollTop=1000'
    js6 = 'document.getElementsByClassName("scroll")[0].scrooLeft=10000' #注意这里用的是elements复数形式
    drver.execute_script(js6)
     
    #js处理多窗口
    链接有target="_blank"属性的时候,就会在另外一个页面打开新链接。。所以去掉这个属性,让新页面在同一个窗口打开就可以了。
    方法:
    1.用js定位大该严肃的class属性,然后直接修改target属性值为空。
    js='document.getElementsByClassName("mnav")[0].target="";'
    driver.execute_script(js)
    driver.find)element_by_link_text("糯米").click()
    *****不是所有的链接都适用于这个方法,只适于有这个target="_blank"属性链接的情况
     
    ### js解决click失效的问题
    元素找到了,运行也没有报错,点击后页面没有任何反应,就是click失效了。
    方法一:先点击它的父元素一次,然后再点击这个元素(以百度保存设置按钮为例)
    driver.find_element("id","gxszButton").click()
    driver.find_element("class name","prefpanelgo").click()
    方法二:js直接点击
    js = 'document.getElementByClassName("prefpanelgo")[0].click();'
    driver.execute_script(js)
     
    ######中定位方法总结#######
    1.id定位:find_element_by_id(self,id_)
    2.name定位:find_element_by_name(self,name)
    3.class定位:find_element_by_class_name(self,name)
    4.tag定位:find_element_by_tag_name(self,name)
    5.link定位:find_element_by_link_text(self,link_text)
    6.partial_link定位:find_element_by_partial_link_text(self,link_text)
     
    7.xpath定位:find_element_by_xpath(self,xpath)
    8.css定位:find_element_by_css_selctor(self,css_selector)
     
    ##以下是复数形式
    1.id定位:find_elements_by_id(self,id_)
    2.name定位:find_elements_by_name(self,name)
    3.class定位:find_elements_by_class_name(self,name)
    4.tag定位:find_elements_by_tag_name(self,name)
    5.link定位:find_elements_by_link_text(self,link_text)
    6.partial_link定位:find_elements_by_partial_link_text(self,link_text)
    7.xpath定位:find_elements_by_xpath(self,xpath)
    8.css定位:find_elements_by_css_selctor(self,css_selector)
     
    ##这两种就是快失传了的
    find_element(self,by='id',value=None)
    find_elements(self,by='id',value=None)
     
    #elements定位方法
    以百度页面为例,有留个clas一样的元素,要定位地图这个元素
     
    elements=driver.find_elements("css selector",".mnav")#先定位到这一组元素
    print elements[3].text #地图在第四个位置
    elements[3].click() #点击地图
     
     
    ## 查看 webdriver API
    1.pydoc是python自带的模块,主要从python模块中自动生成文档,这些文档可以基于文本呈现,也可以生成web页面,还可以再服务器上以浏览器的方式呈现! 就是帮你从代码和注释自动生成文档的工具。
    如:查看python里面open函数的功能和语法,cmd>python -m pydoc open
    -m参数:python以脚本方法运行模块
    2.启动server
    cmd>python -m pydoc -p 6666>http://localhost:6666/
    -p:表示在本机上启动服务
    6666:服务端口号,所以设置
    在浏览器直接打开这个网址,Bulit-in Moudles:这个是python自带的模块
    python2.7libsite-packages,点开selenium
    selenium>webdriver>firefox>webdriver.html
    最终看到就是selenium的webdriver API帮助文档
     
     
    ##alert弹窗 警告框
    accept确认
    dismiss取消
    send_keys输入内容
    al=driver.switch_to.alert()
    al.accept()定位并确定
     
    ##自定义弹窗
    就是会动的广告,将display的属性设置为none就可以去除这种弹窗了。
    js='document.getElementById("doyoo_monitor").style.display="none";'
     
    ##获取百度联想词,如百度搜索里面输入一个词就会出现很多联想的词。
    可以发现,联想词都有一个共同的class属性,定位这组属性就可以了。
    1)通过get_attribute()方法获取到文本信息
    driver.find_element_by_id("kw").send_keys(u"博客")
    #获取百度输入框的联想词
    time.sleep(1)
    bd=driver.find_elements_by_class_name("bdSug_ml")
    #逐个点击
    for i in bd:
      print i.get_attribute("data-key")
    #点击其中一个
    if len(bd)>1:
      ba[1].click()
      #打印当前页面
      print driver.current_url
    else:
      print"未获取到匹配的词"
     
    ## 以下总结了5种js定位的方法
    处了id是定位到的单个element元素对象,其他的都是elements返回的是list对象。
    1)通过id获取:
    document.getElementById("id")
    2)通过name获取
    document.getElementsByName("Name") 返回的是list
    3)通过标签名选取元素
    document.getElementsByTagName("tag")
    4)通过class类选取元素
    document.getElementsByClassName("class")
    #IE8及其以下版本的浏览器未实现getElementsByClassName方法
    5)通过css选择器选取元素
    document.querySelectorAll("css selector")
    #IE8及其以下版本的浏览器只支持css2标准的选择器语法
    id定位
    定位博客园首页的管理按钮:id=“blog_nav_contact”
    js1='document.getElementById("blog_nav_contact").click();'
    driver.execute_script(js1)
    class定位
    class定位获取的是一个list列表,如果只用一个那就取下标。
    定位到输入框,可以直接用value=""方法输入内容
    #输入账号
    js2='document.getElementsByClassName("input-text")[0].value="用户名";'
    driver.execute_script(js2)
    #输入密码
    js3='document.getElementsByClassName("input-text")[1].value="密码";'
    driver.execute_script(js3)
     
     
    ####封装读取Excel方法
    python读取Excel方法,并保存为字典格式
    环境准备:
    01.先安装xlrd模块,打开cmd,输入pip install xlrd在线安装
    cmd>pip install xlrd
     
    ####exlce基本操作方法如下:
    #打开Excel表格,参数是文件路径
    data=xlrd.open_workbook('test.xlsx')
     
    #table=data.sheets()[0] 通过索引顺序获取
    #table=data.sheet_by_index(0) 通过索引顺序获取
    table=data.sheet_by_name(u'Sheet1') 通过名称获取
    nrows = table.nrows #获取总行数
    ncols=table.ncols #获取总列数
     
    #获取一行或一列的值,参数是第几行
    print table.row_values(0) #获取第一行
    print table.col_value(0) #获取第一列值
     
    #Excel存放数据
    在Excel中存放数据,第一行为标题,也就是对应字典里面的key值,如:username,password
    如果Excel数据中公有纯数字的一定要设置单个格式为文本格式,要不然读取的数据是浮点数。(先设置单元格格式后编辑,编辑成功左上角有个小三角图标)
     
     
    数据驱动ddt
    有些用例,操作过程是一样的,就是输入的数据不一样,比如登录这个功能。可以用数据驱动设计模式,一组数据对应一个测试用例。用例自动加载生成。
    1.安装ddt模块,
    cmd>pip install ddt 在线安装
    2.数据驱动原理
    --1.测试数据为多个字典的list类型
    --2.测试类钱修饰@ddt.ddt
    --3.case钱加修饰@ddt.data()
    --4.运行后用例会自动加载成三个单独的用例
     
    如:
    import ddt
    import unittest
    ##判断元素(expected_conditions)
    如何判断一个元素是否存在,如何判断alert弹窗出来了,如何判断动态的元素等等。面试必考。
     
    expected_conditions一般也称为EC。
    ###.功能介绍和翻译。
    1.title_is:判断当前页面的title是否完全等于(==)预期字符串,返回布尔值
     
    2.title_contains:判断当前页面的title是否包含预期字符串,返回布尔值
     
    3.presence_of_element_located:判断某个元素是否被加到了dom树里,并不代表该元素一定可见
     
    4.visibility_of_element_located:判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高等不等于0.
     
    5.visibility_of:跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了
     
    6.presence_of_all_elements_located;判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是‘column-md-3’,那么只要有1个元素存在,这个方法就返回true。
     
     
    7.text_to_be_present_in_element:判断某个元素中的text是否包含了预期的字符串
     
    8.text_to_be_present_in_element_value:判断某个元素中的value属性是否包含了预期的字符串。
     
     
    9.frame_to_be_available_and_switch_to_it:判断该frame是否可以switch进去,如果可以的话,返回ture并且switch进去,否则返回false。
     
    10.invisibility_of_element_located:判断某个元素中是都不存在与dom树或不可见
     
     
    11.element_to_be_clickable:判断某个元素中是否可见并且是enable的,这样的话才叫clickable
     
    12.staleness_of:等某个元素从dom树中移除,足以,这个方法也是返回ture或false
     
    13.element_to_be_selected:判断某个元素是否被选中了,一般用在下拉列表
     
     
    14.element_selection_state_to_be:判断某个元素的选中状态是否符合预期
     
    15.element_located_selection_state_to_be:跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator
     
    16.alert_is_present:判断页面上是否存在alert

    unittest定位参数化
    by_id="id"
    by_xpath="xpath"
    by_link_text="link text"
    by_partial_text="partial link text"
    by_name="name"
    by_tag_name="tag name"
    by_class_name="class name"
    by_css_selector="css selector"
     
    driver.find_element("link text","糯米").text
    前面是by后边的方法,后边是值
     
    css定位:

     driver.find_element_by_css_selector("input[id='xx'][name='xx']")

     

  • 相关阅读:
    django系列6--Ajax03 ajax参数
    django系列6--Ajax06 使用插件,Sweet-Alert插件
    django系列6--Ajax05 请求头ContentType, 使用Ajax上传文件
    django系列6--Ajax04 请求设置(设置csrf_token)
    django系列6--Ajax01 特点, 基本格式, 向前端发送数据
    django系列4.2--自定义标签, 自定义过滤器, inclusion_tag, 引入静态文件(css,js等)
    面向对象之封装之如何隐藏属性, 封装的底层原理
    面向对象之------多态与多态性
    在子派生的新方法中重用父类功能的两种方式
    菱形继承
  • 原文地址:https://www.cnblogs.com/ni-huang-feng-wu/p/14772715.html
Copyright © 2020-2023  润新知