51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 769|回复: 0
打印 上一主题 下一主题

[selenium] 实用干货selenium常用的API(含源码)

[复制链接]
  • TA的每日心情
    无聊
    2024-7-29 11:15
  • 签到天数: 32 天

    连续签到: 1 天

    [LV.5]测试团长

    跳转到指定楼层
    1#
    发表于 2022-8-25 14:32:16 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
    1.八大元素定位方式driver.find_element_by_id(‘text’)

    通过id去定位控件【在web端ID一般是唯一的】

    1. <font size="3"># <i id="cart_num">0</i>
    2. from selenium import webdriver # 导入selenium库里的webdriver模块
    3. import time

    4. driver = webdriver.Chrome() # 初始化webdriver类的对象
    5. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    6. driver.maximize_window()

    7. driver.find_element_by_id('cart_num').click() # driver.find_element_by_id_text('cart_num')仅仅是定位到car_num控件,click()才是点击的动作
    8. </font>
    复制代码
    driver.find_element_by_name(‘text’)

    通过name去定位控件【在web端name有可能是重复的,默认找的是第一个,如果报错一般会换其他方式】

    1. <font size="3"># <input class="but1" type="text" name="key" placeholder="请输入你要查找的关键字" value="">
    2. from selenium import webdriver # 导入selenium库里的webdriver模块
    3. import time

    4. driver = webdriver.Chrome() # 初始化webdriver类的对象
    5. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    6. driver.maximize_window()

    7. driver.find_element_by_name('key').send_keys('王麻子')
    8. </font>
    复制代码
    driver.find_element_by_class_name(‘text’)

    通过class去定位控件【对于属性值中间有空格的如’but bg’为复合类,不建议用class去定位,因为会报错】【所用控件必须具有链接属性】

    1. <font size="3"># <input class="but2" type="submit" value="搜索">
    2. from selenium import webdriver # 导入selenium库里的webdriver模块
    3. import time

    4. driver = webdriver.Chrome() # 初始化webdriver类的对象
    5. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    6. driver.maximize_window()

    7. driver.find_element_by_class_name('but2').click()
    8. </font>
    复制代码
    driver.find_element_by_link_text(‘text’)

    【传入值为a标签中间加的值】

    1. <font size="3"># <a href="http://101.133.169.100/yuns/index.php/goods?key=家装节" title="家装节">家装节</a>
    2. from selenium import webdriver # 导入selenium库里的webdriver模块
    3. import time

    4. driver = webdriver.Chrome() # 初始化webdriver类的对象
    5. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    6. driver.maximize_window()

    7. driver.find_element_by_link_text('家装节').click()
    8. </font>
    复制代码
    driver.find_element_by_partial_link_text(‘text’)

    【传入值部分匹配,如’T恤男’,‘男2016’,‘T恤男2’;注意传入值条件:1.必须唯一;2.必须连续】

    1. <font size="3"># <a href="http://101.133.169.100/yuns/index.php/goods?key=T恤男2016" title="T恤男2016" class="ch">T恤男2016</a>
    2. from selenium import webdriver # 导入selenium库里的webdriver模块
    3. import time

    4. driver = webdriver.Chrome() # 初始化webdriver类的对象
    5. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    6. driver.maximize_window()

    7. driver.find_element_by_partial_link_text('T恤男').click()
    8. </font>
    复制代码
    driver.find_element_by_xpath
    1. <font size="3"># <input class="but1" type="text" name="key" placeholder="请输入你要查找的关键字" value="">绝对路径不适用于页面层级太深的
    2. from selenium import webdriver # 导入selenium库里的webdriver模块
    3. import time

    4. driver = webdriver.Chrome() # 初始化webdriver类的对象
    5. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    6. driver.maximize_window()

    7. driver.find_element_by_xpath("/html/body/div/div/div/div/form/input[1]").click()  # 绝对路径/
    8. driver.find_element_by_xpath("//input[@class='but1']").click()  # 相对路径// 1.(单条件定位)用属性定位@后跟属性class或其他,=后为唯一值;2.(多条件定位)('//input[@name='key' and @class='but1']')
    9. driver.find_element_by_xpath("//input[@class='but1']").click()  # 单条件定位
    10. driver.find_element_by_xpath("//input[@name='key'and @class='but1']").click()  # 多条件定位
    11. driver.find_element_by_xpath("//input[contains(@placeholder,'请输入')]").click()  # 属性值模糊定位
    12. driver.find_element_by_xpath("//a[text()='家装节']").click()  # 值条件定位
    13. driver.find_element_by_xpath("//*[text()='家装节']").click()  # 值条件定位,*代表正则匹配,只要是text值为家装节的就可以被搜索到
    14. driver.find_element_by_xpath("//div[@class='schbox']/form/input[1]").click()  # 父级定位 爸找儿子
    15. driver.find_element_by_xpath("//input[@class='but1']/..").click()  # 子级定位 儿子找爸
    16. driver.find_element_by_xpath("//input[@class='but1']/../input[2]").click()  # 兄弟定位,子级定位再父级定位
    17. </font>
    复制代码
    driver.find_element_by_css_selector

    注意不同标签,css-selector也会一同排序
    写绝对路径最好用xpath

    1. <font size="3"># <input class="but1" type="text" name="key" placeholder="请输入你要查找的关键字" value="">
    2. from selenium import webdriver # 导入selenium库里的webdriver模块
    3. import time

    4. driver = webdriver.Chrome() # 初始化webdriver类的对象
    5. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    6. driver.maximize_window()

    7. driver.find_element_by_css_selector("html>body>div>div>div>div>form>input").click()  # 绝对路径
    8. driver.find_element_by_css_selector("i#cart_num").click()  # id定位 【i是标签名,用id定位必须是#】
    9. driver.find_element_by_css_selector("input.but1").click()  # class定位
    10. driver.find_element_by_css_selector("input[placeholder='请输入你要查找的关键字']").click()  # 搜索值唯一定位
    11. driver.find_element_by_css_selector("input[name='key'][class='but1']").click()  # 多条件定位
    12. driver.find_element_by_css_selector("div.schbox>form>input:nth-child(1)").click()  # 父级定位
    13. driver.find_element_by_css_selector("div.schbox>form>input:first-child").click()  # 父级定位-第一个
    14. driver.find_element_by_css_selector("div.schbox>form>input:last-child").click()  # 父级定位-最后一个
    15. driver.find_element_by_css_selector("div.schbox>form>input:nth-last-child(2)").click()  # 父级定位-倒数第二个
    16. driver.find_element_by_css_selector("form#form>span:nth-child(9)>input").click()  # css是不同标签一同排序,比如span和div【此处id为form,第一个form为标签名】
    17. </font>
    复制代码
    driver.find_element_by_tag_name

    页面的tag实在是太多了,因此一般用做计数标签数量,

    1. <font size="3"># <input class="but1" type="text" name="key" placeholder="请输入你要查找的关键字" value="">
    2. from selenium import webdriver # 导入selenium库里的webdriver模块
    3. import time

    4. driver = webdriver.Chrome() # 初始化webdriver类的对象
    5. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    6. driver.maximize_window()

    7. aa = driver.find_elements_by_tag_name('div')
    8. print(len(aa))
    9. </font>
    复制代码
    2.操作(1)获取验证信息

    driver.current_url:对于要获取点击的文本链接信息,则需要先点击,才能再获取。
    driver.title:直接获取当前网页的title信息

    1. <font size="3">from selenium import webdriver # 导入selenium库里的webdriver模块
    2. import time

    3. driver = webdriver.Chrome() # 初始化webdriver类的对象
    4. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    5. driver.maximize_window()

    6. title = driver.title  # 获取网页的title信息【网页标签的名字】

    7. driver.find_element_by_link_text("联系客服").click()
    8. url = driver.current_url  # 获取当前跳转后的页面地址

    9. print(title)
    10. print(url)
    11. </font>
    复制代码
    (2)页面控制

    driver.refresh():刷新
    driver.back():回退
    driver.forward():前进

    1. <font size="3">from selenium import webdriver # 导入selenium库里的webdriver模块
    2. import time

    3. driver = webdriver.Chrome() # 初始化webdriver类的对象
    4. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    5. driver.maximize_window()

    6. driver.refresh()  # 刷新
    7. time.sleep(2)
    8. driver.back()  # 回退
    9. time.sleep(2)
    10. driver.forward()  # 前进
    11. time.sleep(2)
    12. </font>
    复制代码
    (3)窗体设置

    driver.maximize_window():窗体最大化
    driver.set_windows_size(1200,720):设置窗体长1200宽720

    1. <font size="3">from selenium import webdriver # 导入selenium库里的webdriver模块
    2. import time

    3. driver = webdriver.Chrome() # 初始化webdriver类的对象
    4. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    5. driver.maximize_window()  # 窗体最大化
    6. driver.set_windows_size(1200,720)  # 设置窗体宽1200高720
    7. </font>
    复制代码
    (4)动作事件

    定位控件.send_keys(‘text’):对定位控件输入内容text
    定位控件.clear():对定位空间清空内容
    定位控件.click():点击定位控件

    1. <font size="3">from selenium import webdriver # 导入selenium库里的webdriver模块
    2. import time

    3. driver = webdriver.Chrome() # 初始化webdriver类的对象
    4. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    5. driver.maximize_window()

    6. driver.find_element_by_name('key').send_keys('王麻子')  # 输入内容
    7. driver.find_element_by_name('key').clear()  # 清空输入内容
    8. driver.find_element_by_partial_link_text('T恤男').click()  # 点击
    9. </font>
    复制代码
    (5)获取属性数据
    定位控件.size:获取控件长宽数据,数据类型为字典{‘height’:’’,‘weihght’:’’}
    定位控件.text:获取控件上文本信息
    定位控件.get_attribute(“href”):获取控件内默认信息,href为属性名
    定位控件.get_attribute(‘value’) : 固定传value,在输入内容后获取其回显信息【先输入内容在获取回显信息】
    定位控件.is_displayed():判断控件是否显示
    1. <font size="3">from selenium import webdriver # 导入selenium库里的webdriver模块
    2. import time

    3. driver = webdriver.Chrome() # 初始化webdriver类的对象
    4. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    5. driver.maximize_window()

    6. size = driver.find_element_by_name('key').size  # 获取控件长宽数据,获取的数据类型为字典{'height':'','weihght':''}
    7. text = driver.find_element_by_name('key').text  # 获取控件上文本信息
    8. at = driver.find_element_by_name('key').get_attribute("href")  # 获取控件内默认信息,href为属性名
    9. dis = driver.find_element_by_name('key').is_displayed()  # 判断是否显示,true/false
    10. text = driver.find_element_by_name('key').get_attribute('value')  # 固定传value拿到输入后的回显信息
    11. </font>
    复制代码
    (6)鼠标事件
    ele = 定位控件
    ActtionChains(driver).move_to_element(ele).perform():将鼠标移动到定位控件上悬停【类似于hover】
    ActtionChains(driver).context_click(ele).perform():鼠标右击定位控件
    ActtionChains(driver).double_click(ele).perform():鼠标双击定位控件

    scour = driver.find_element_by_xpath(""):确定拖拽目标的起点
    target = driver.find_element_by_xpath(""):确定拖拽目标的终点
    ActionChains(driver).drag_and_drop(scour,target):拖拽目标从起点到终点

    ActionChains(driver).drag_and_drop_by_offset(scour,100,0):拖拽目标(起点,x值,y值)
    1. <font size="3">from selenium.webdriver.common.action_chains import ActionChains  # 引入 ActionChains 类
    2. from selenium import webdriver # 导入selenium库里的webdriver模块
    3. import time

    4. driver = webdriver.Chrome() # 初始化webdriver类的对象
    5. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    6. driver.maximize_window()

    7. ele = driver.find_element_by_link_text("母婴玩具")
    8. ActtionChains(driver).move_to_element(ele).perform()  # 把鼠标移到某个控件上.perform()使动作生效
    9. ActtionChains(driver).context_click(ele).perform()  # 右击
    10. ActtionChains(driver).double_click(ele).perform()  # 双击
    11. # .perform() 运行动作

    12. # 拖动控件
    13. scour = driver.find_element_by_xpath("")
    14. target = driver.find_element_by_xpath("")
    15. ActionChains(driver).drag_and_drop(scour,target)

    16. ActionChains(driver).drag_and_drop_by_offset(scour,100,0)  # 偏移
    17. </font>
    复制代码
    (7)键盘事件
    定位控件.send(‘女装’):输入数据
    定位控件.keys(Keys.Back_SPACE):删除1个字符
    定位控件.keys(Keys.SPACE):输入空格
    定位控件.keys(Keys.CONTROL,‘a’):传入CTRL+a
    定位控件.keys(Keys,ENTER):传入enter
    注意:复制后需要重新选中粘贴才看得到效果【查看keys方法可以看见相应的键盘输入内容】
    1. <font size="3">from selenium.webdriver.common.keys import Keys  # 引入keys
    2. from selenium import webdriver # 导入selenium库里的webdriver模块
    3. import time

    4. driver = webdriver.Chrome() # 初始化webdriver类的对象
    5. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    6. driver.maximize_window()

    7. text = driver.find_element_by_name('key').send('女装')  # 输入数据
    8. text = driver.find_element_by_name('key').keys(Keys.Back_SPACE)  # 删除1个字符
    9. text = driver.find_element_by_name('key').keys(Keys.SPACE)  # 输入空格
    10. </font>
    复制代码
    (8)等待时间
    因为代码执行的速度非常快,因此若不给以适当的等待时间,由于页面未加载完毕,可能会出现漏报甚至错报,所以加入等待时间。
    time.sleep(4):强制等待时间【线程休眠,不进行执行操作,直到时间等待完才继续执行】
    dirver.implicitly_wait(10):隐式等待时间,相当于最大等待时间(全局),如果只用了2s则无需等待10秒,便可继续执行后面操作【缺点是第一个是如果第一页的元素第二页也有,因为网络原因或其他原因加载慢了或是没加载出来,原本需要在第二个页面查找的元素,返回的元素却是第一个页面的元素,而且在该函数之后如果出现了强制等待时间,则会打破其的全局性,接下来的代码将不会有等待时间】
    ele = WebDriverWait(driver,15,0.5).until(EC.presence_of_element_located((By.XPATH,“定位控件”))) /n ele.控件操作:显式等待时间【最大等待时间15s,每0.5秒检测一次,知直到当前页面加载出来xpath的xx的控件,才对其做相应操作】XPATH可为其他定位方法名如ID、CSS_SELECTOR、…
    1. <font size="3">from selenium import webdriver # 导入selenium库里的webdriver模块
    2. import time

    3. driver = webdriver.Chrome() # 初始化webdriver类的对象
    4. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    5. driver.maximize_window()

    6. time.sleep(2)  # 强制等待时间,时间等待完才继续执行

    7. # 隐式等待时间
    8. dirver.implicitly_wait(10)  # 隐式等待时间,相当于最大等待时间(全局),如果只用了2s则无需等待10秒,便可继续执行后面操作【缺点是第一个是如果第一页的元素第二页也有,因为网络原因或其他原因加载慢了或是没加载出来,原本需要在第二个页面查找的元素,返回的元素却是第一个页面的元素】
    9. time.sleep(3)  # 而且在隐式等待时间下有time.sleep()则会打破全局的规则,而且之后代码执行也不会有时间等待
    10. </font>
    复制代码
    显式等待时间
    from selenium.webdriver.support.ui import WebDriverWait # 显式等待时间所需要引入的模块
    from selenium.webdriver.common.by import By # 显式等待时间所需要引入的模块
    from selenium.webdriver.support import expected_conditions as EC # 显式等待时间所需要引入的模块
    1. <font size="3">from selenium.webdriver.support.ui import WebDriverWait  # 显式等待时间所需要引入的模块
    2. from selenium.webdriver.common.by import By  # 显式等待时间所需要引入的模块
    3. from selenium.webdriver.support import expected_conditions as EC  # 显式等待时间所需要引入的模块
    4. from selenium import webdriver # 导入selenium库里的webdriver模块
    5. import time

    6. driver = webdriver.Chrome() # 初始化webdriver类的对象
    7. driver.get('http://101.133.169.100/yuns/index.php') # 打开项目地址
    8. driver.maximize_window()

    9. # 最大等待时间15s,每0.5秒检测一次,知直到当前页面加载出来xpath的xx的控件
    10. ele = WebDriverWait(self.driver,15,0.5).until(EC.presence_of_element_located(
    11.         (By.XPATH,"//div[@class='schbox']/form/input[1]")))
    12. ele.send_keys("123456")

    13. ele = WebDriverWait(self.driver,15,0.5).until_not(EC.presence_of_element_located(
    14.         (By.XPATH,"//div[@class='schbox']/form/input[1]")))
    15. ele.send_keys("123456")
    16. </font>
    复制代码
    等待时间的时间怎么确认?以多次测试的最大等待时间+1s-2s为准

    (9)多窗口
    driver.switch_to.window(driver.window_handles[-1]):切换最新打开的窗体
    driver.close():关闭当前句柄所在窗体
    driver.quit():退出所有窗体
    1. <font size="3">from selenium import webdriver # 导入selenium库里的webdriver模块
    2. import time

    3. driver = webdriver.Chrome() # 初始化webdriver类的对象
    4. driver.get('http://www.baidu.com') # 打开项目地址
    5. driver.maximize_window()
    6. print(driver.windiws_handles)  # 打印当前所有窗体的信息
    7. driver.find_element_by_id('kw'),send_keys('123')
    8. driver.find_element_by_id('su').click()

    9. driver.find_element_by_partial_link_text('123网址').click()
    10. print(driver.windiws_handles)  # 打印当前所有窗体的信息
    11. print(driver.current_window_handle)  # 打印当前窗体所在句柄的信息
    12. driver.switch_to.window(driver.window_handles[1])  #切换句柄为1的新窗体
    13. driver.close()  #关闭当前句柄所在窗体
    14. driver.quit()  #所有浏览器退出
    15. </font>
    复制代码
    (10)弹窗处理
    鼠标右击查看不了的弹出框就是alert
    driver.switch_to.alert.send_keys(“test”):输入信息
    print(driver.switch_to.alert.text) :获取信息
    driver.switch_to.alert.accept() :点击确定【正向信息,如确定、提交】
    driver.switch_to.alert.dismiss():点击取消【反向信息,如取消,删除等】
    1. <font size="3">from selenium import webdriver # 导入selenium库里的webdriver模块
    2. import time

    3. driver = webdriver.Chrome() # 初始化webdriver类的对象
    4. driver.get('http://') # 打开项目地址
    5. driver.maximize_window()

    6. driver.switch_to.alert.send_keys("test")  #输入信息
    7. print(driver.switch_to.alert.text)  # 获取信息
    8. driver.switch_to.alert.accept()  # 点击确定
    9. driver.switch_to.alert.dismiss()  #点击取消

    10. </font>
    复制代码
    (11)截图

    存储截图便于分析
    driver.get_screenshot_as_file(“C:/Users/Hades/Desktop/name.png”):截图(当前句柄所在窗体)到真实地址,有路径和名称【png格式】

    1. <font size="3">from selenium import webdriver # 导入selenium库里的webdriver模块
    2. import time

    3. driver = webdriver.Chrome()  # 初始化webdriver类的对象
    4. driver.get('http://101.133.169.100/yuns/index.php')  # 打开项目地址
    5. driver.maximize_window()

    6. driver.get_screenshot_as_file("C:/Users/Hades/Desktop/name.png")   # 截图(当前句柄所在窗体)到真实地址
    7. </font>
    复制代码

    12)iframe网页嵌套

    iframe是控件,frame是方法

    有id/name且不变化,可用。

    driver.switch_to.frame(‘x-URS-iframe’)括号里跟id/name直接切入iframe里【x-URS-iframe是id】


    无id/name,先定位元素位置

    dd = driver.find_element_by_xpath("//div[@id=‘loginDiv’]/iframe"):获取iframe的id或其他定位信息

    driver.switch_to.frame(dd):先定位位置,再定位内部信息 ,


    driver.switch_to.parent_frame():从子frame切回到父frame【层层嵌套】

    driver.switch_to.default_content():切回主文档

    1. <font size="3">from selenium import webdriver # 导入selenium库里的webdriver模块
    2. import time

    3. driver = webdriver.Chrome()  # 初始化webdriver类的对象
    4. driver.get('https://mail.163.com')  # 打开项目地址
    5. driver.maximize_window()


    6. dd = driver.find_element_by_xpath("//div[@id='loginDiv']/iframe")  #获取id
    7. driver.switch_to.frame(dd)  #先定位位置,再定位内部信息

    8. driver.switch_to.frame('x-URS-iframe')  #有id,name 且不变化可用

    9. driver.switch_to.parent_frame()#从子frame切回到父frame
    10. driver.switch_to.default_content()#切回主文档
    11. </font>
    复制代码

    (13)select下拉选择框

    s = driver.find_element_by_id(“j_roomCountList”):找到select控件,将其赋值给s

    Select(s).select_by_visible_text(“2间”):定位到可见的文本信息【2间】

    Select(s).select_by_index(3):用index定位,类似于列表,从0开始

    Select(s).select_by_value(6)::用value的值定位

    1. <font size="3">from selenium.webdriver.support.select import Select  # 导入下拉选择框类
    2. from selenium import webdriver # 导入selenium库里的webdriver模块
    3. import time

    4. driver = webdriver.Chrome()  # 初始化webdriver类的对象
    5. driver.get('https://ctrip.com')  # 打开项目地址
    6. driver.maximize_window()

    7. emailname=driver.find_element_by_name('email')
    8. emaiiname.send_keys('testiframe')

    9. s = driver.find_element_by_id("j_roomCountList") # 找到select控件,将其赋值给s
    10. Select(s).select_by_visible_text("2间")  # 定位到可见的文本信息【2间】
    11. Select(s).select_by_index(3)  # 用index定位,类似于列表,从0开始
    12. Select(s).select_by_value(6)  # 用value的值定位

    13. </font>
    复制代码

    14)时间控件处理

    可输入内容

    ele = d.find_element_by_id(‘HD_CheckIn’):定位控件

    ele.clear():控件内容清空

    ele.send_keys(‘2021-05-16’):重新输入值


    时间控件属性readonly='readonly’的

    js = “document.getElementById(‘noticeEndTime’).removeAttribute(‘readonly’)” :移除readonly属性

    d.execute_script(js) :执行js

    d.find_element_by_name(“noticeEndTime”).send_keys(“2019-06-21 10:52:52”) :按照正常时间控件输入处理

    1. <font size="3">from selenium import webdriver # 导入selenium库里的webdriver模块
    2. import time

    3. driver = webdriver.Chrome()  # 初始化webdriver类的对象
    4. driver.get('https://ctrip.com')  # 打开项目地址
    5. driver.maximize_window()

    6. ele = d.find_element_by_id('HD_CheckIn')  # 定位控件
    7. ele.clear()  # 控件内容清空
    8. ele.send_keys('2021-05-16')  #重新输入值

    9. js = "document.getElementById('noticeEndTime').removeAttribute('readonly')" :移除readonly属性
    10. #js = "document.getElementsByName('noticeEndTime')[0].removeAttribute('readonly')"
    11. #js = "document.getElementsByTagName('input')[0].removeAttribute('readonly')"
    12. d.execute_script(js) :执行js
    13. d.find_element_by_name("noticeEndTime").send_keys("2019-06-21 10:52:52") :按照正常时间控件输入处理
    14. </font>
    复制代码

    **(15)**滚动条

    js=“var q=document.documentElement.scrollTop=10000” # 一个js脚本给10000(足够大的数)滚动到页面最底部

    driver.execute_script(js) # 执行js

    driver.execute_script(“var q=document.documentElement.scrollTop=0”) # 执行js-滚动到页面最顶部

    driver.execute_script(“window.scrollTo(0, document.body.scrollHeight*0.5)”) # 滚动到窗体高度的50%【scrollTo:到哪里;x方向是0,y方向为窗口body高度的50%,】

    driver.execute_script(‘window.scrollBy(0,200)’) # 以当前位置为准【相对】(x方向为0,y方向向上偏移200)

    driver.execute_script(‘window.scrollTo(0,1500)’) # 以当前位置为准【绝对】(x方向为0,y方向为1500)

    1. <font size="3">from selenium import webdriver # 导入selenium库里的webdriver模块
    2. import time

    3. driver = webdriver.Chrome()  # 初始化webdriver类的对象
    4. driver.get('https://ctrip.com')  # 打开项目地址
    5. driver.maximize_window()

    6. js="var q=document.documentElement.scrollTop=10000"  # 一个js脚本给10000(足够大的数)滚动到页面最底部
    7. driver.execute_script(js)  # 执行js

    8. js="var q=document.documentElement.scrollTop=0"  # 滚动到页面最顶部
    9. driver.execute_script(js)  # 执行js

    10. driver.execute_script("window.scrollTo(0, document.body.scrollHeight*0.5)")  # 滚动到窗体高度的50%【scrollTo:到哪里;x方向是0,y方向为窗口body高度的50%,】

    11. driver.execute_script('window.scrollBy(0,200)')  # 以当前位置为准【相对】(x方向为0,y方向向上偏移200)

    12. driver.execute_script('window.scrollTo(0,1500)')  # 以当前位置为准【绝对】(x方向为0,y方向为1500)
    13. </font>
    复制代码

    (16)文件上传

    input标签

    我们在做selenium自动化时,必须要面临的就是页面元素的定位,如果该上传文件功能的标签类型为input,例如:


    以上类型的上传文件功能吗,我们可以直接使用selenium中的元素定位+send_keys()方法,括号内传入文件路径,例如:

    driver.find_element_by_xpath("").send_keys(r"c:/test.png")

    以上是针对于元素类型为input可直接使用selenium上传。


    验证码

    用selenium来获取获取cookies。

    因为经常会出现验证码,导致我们ui自动化测试工作无法更好开展,那么如何处理这种验证码呢?

    像这种滑块和手机验证码的情况下,无法通过正常办法是没有办法进行处理,那么 一般对这种处理有以下几种思路:

    1、 通过接口请求,拿到对应验证码信息

    2、 让开发配合把验证码搞成万能验证码

    3、 注入cookies


    那么如何通过注入cookies的形式来实现呢?

    首先我们先通过自动化形式打开我们登录页面,此时我们加一定的延时时间,手动登录后,打印出来cookies信息,此时我们就知道所需要的cookies信息了。

    1. <font size="3">driver = webdriver.Chrome()
    2. driver.get("https://fly.layui.com/user/login/")
    3. time.sleep(30)
    4. cookies = driver.get_cookies()
    5. print (cookies)
    6. </font>
    复制代码

    复制代码
    这样你之前的cookies信息就会存在cookies的json文件中,下次要去使用就直接读文件就好了,具体实现如下:
    2、自动化代码的注入cookies办法:

    1. <font size="3">driver = webdriver.Chrome()
    2. driver.get("https://fly.layui.com/user/login/")
    3. time.sleep(3)
    4. with open('cookiesFile.json','r') as filemy:
    5.      cookiesInfo=json.loads(filemy.read())
    6. for cc in range(0,len(cookiesInfo)):
    7.     driver.add_cookie(cookiesInfo[cc])
    8. driver.refresh()
    9. </font>
    复制代码

    复制代码此时通过refresh后,我们就直接登入了系统,是不是很方便呢?

    另外需要注意的是:

    77版本的Chrome浏览器:对于 ‘expiry’ 参数,不支持float类型上传,这参数表示过期时间,给浏览器添加时,

    浏览器只识别整形的,多少秒。 需要将driver.get_cookies() 得到的Cookies,变为整型,才可做cookie绕过验证码登录。

    1. <font size="3">for i in cookies:
    2.     if 'expiry' in i and i['expiry'] is  not None
    3.         i['expiry']= int(i['expiry'])
    4. </font>
    复制代码






    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-25 09:33 , Processed in 0.071823 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表