经典自学笔记Selenium自动化测试第二天(下)

动作链 模拟鼠标操作

  • click(): 单击
  • double_click(): 双击
  • context_click(): 右击
  • move_to_element(a): 移动到元素a
  • drag_and_drop(a,b): 拖放,将a拖动到b元素位置
  • click_and_hold(): 单击并按住鼠标左键 release(): 松开鼠标

from selenium.webdriver.common.action_chains import ActionChains ... menu = driver.find_element_by_xpath("//input[@value='下拉菜单']") ActionChains(driver).move_to_element(menu).perform()

示例

from selenium import webdriver from time import sleep from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.maximize_window() driver.get("http://115.28.108.130/control.html") sleep(1) # driver.find_element_by_link_text("baidu").click() # 找不到该元素 dropdown = driver.find_element_by_xpath("//input[@value='下拉菜单']") ActionChains(driver).move_to_element(dropdown).perform() # 记得使用perform()执行 driver.find_element_by_link_text("baidu").click() sleep(5) driver.quit()

练习

打开百度->设置->高级搜索->输入龙腾育才->搜索

注意

  1. 不要忘记使用perform()执行操作

Keys模拟键盘

from selenium.webdriver.common.keys import Keys .... input = driver.find_element_by_id("kw") input.send_keys("龙腾育才") input.send_keys(Keys.ENTER)

示例

from selenium import webdriver from time import sleep from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.maximize_window() driver.get("http://www.baidu.com") input = driver.find_element_by_id("kw") # 注意不要使用 input = driver.find_element_by_id("kw").send_keys("龙腾育才") input.send_keys("龙腾育才") input.send_keys(Keys.ENTER) sleep(5) driver.quit()

练习

打开百度

  1. 输入龙腾育才
  2. 退格2次
  3. 全选 复制 粘贴

截图

一般用例出错或失败时要截图

  1. save_snapshot(path) get_snapshot_as_file(path) # path是保存的图片路径

示例

from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.set_window_size(800,600) driver.get("http://www.baidu.com") driver.save_screenshot("d:/1.png") # 只支持png格式 等同于 driver.get_screenshot_as_file("d:/2.png") sleep(5) driver.quit()

注意

  1. 只支持png格式

等待

  1. 强制等待 time.sleep(5)
  2. 隐性等待(智能等待) driver.implicitly_wait(10) 10s超时 所有元素定位不到都会等待
  3. 显性等待(高级用法)
    wait = WebDriverWait(driver,20)
    wait.until(lambda driver: driver.find_element_by_id("...").click())
    每隔一定时间查找并单击元素,直到找到

使用定位器定位

find_element(*location) By.ID, "kw"

from selenium.webdriver.common.by import By find_element(By.ID, "") find_element_by_id("") find_element(By.NAME, "") find_element_by_name("") find_element(By.CLASS_NAME, "") find_element_by_class_name("") find_element(By.LINK_TEXT, "") find_element_by_link_text("") find_element(By.PARTIAL_LINK_TEXT, "") find_element_by_partial_link_text("") find_element(By.PATH, "") find_element_by_partial_xpath("") find_element(By.PARTIAL_CSS_SELECTOR, "") find_element_by_css_selector("")

  • ID = "id"
  • XPATH = "xpath"
  • LINK_TEXT = "link text"
  • PARTIAL_LINK_TEXT = "partial link text"
  • NAME = "name"
  • TAG_NAME = "tag name"
  • CLASS_NAME = "class name"
  • CSS_SELECTOR = "css selector"

使用期望条件(except_conditions)

  • presence_of_element_located((By.XPATH,"")): 直到元素出现并能定位到

view = wait.until(EC.presence_of_element_located((By.XPATH,'//td[text()="王五"]/../td[4]/a'))) view.click()

示例

from selenium import webdriver from time import sleep from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.maximize_window() driver.get("http://115.28.108.130/control.html") # driver.implicitly_wait(10) wait = WebDriverWait(driver, 20) # 等待元素出现并操作元素 # wait.until(lambda driver: driver.find_element(By.XPATH, '//*[text()="王五"]/following::td[3]/a').click()) # 相当于 等待出现 再 操作元素 注意 presence_of_element_located((By.ID, "")) 里面传一个元祖参数 lookup = wait.until(EC.presence_of_element_located((By.XPATH, '//*[text()="王五"]/following::td[3]/a'))) lookup.click() sleep(5) driver.quit()

开挂的js

使用js可以修改网页

  1. 隐藏元素
    selenium默认定位不到隐藏元素

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

hide
hidden
hidden="hidden"
style="display: none"
1. 按手工逻辑操作使其显示再定位
2. 使用js强制改成显示再定位

# 移除相应属性 driver.execute_script( document.querySelector("#hd1").removeAttribute("hidden"); )

  1. 不可输入/点击(移除readonly/disable属性)
  2. 拖动滚动条(流加载页面) document.documentElement.scrollTop=10000;
  3. 富文本框
  4. 更改元素样式

js2 = ''' var q = document.getElementById("buttonID"); q.value="hello"; q.style.backgroundColor="red"; ''' driver.execute_script(js2)

  1. 为一些不好定位的元素添加id

js4=''' ''' q = document.querySelector("#firstdiv>form>table"); q.id = "table1";

示例

from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.maximize_window() driver.get("http://115.28.108.130/control.html") # # 1. 滚动页面 document.documentElement.scrollTop=1000 # # driver.find_element_by_link_text("友情链接").click() # 不需要滚动页面页可以定位到下面的元素(只要加载了) # # driver.back() # js = 'document.documentElement.scrollTop=1000;' # DTD网页 否则使用docment.body.scrollTop=1000; 滚动到居上1000像素处 # driver.execute_script(js) # 可用于处理流页面 # # sleep(3) # # 2. 更改元素样式 使用 document.getElementById() 得到DOM对象 # js = ''' # document.documentElement.scrollTop=0; # var q = document.getElementById("buttonID"); # q.style.backgroundColor="red"; # # ''' # driver.execute_script(js) # # sleep(3) # # 3. 移除readonly/disable/hidden/属性 使用jquery定位 $(#id) 和getElementById("")得到的DOM对象不同 两者拥有不同的方法 # js = "document.querySelector('#ro').removeAttribute('readonly')" # # js = "$('#ro').removeAttribute('readonly')" # driver.execute_script(js) # ro = driver.find_element_by_id("ro") # ro.clear() # ro.send_keys("成功输入") # # # 或直接使用js修改value # js = 'document.querySelector("#ro").value="成功输入"' # driver.execute_script(js) # 4. 富文本框输入 driver.get("http://www.vemmis.com/bjq/index.html") # js操作iframe 先获取iframe里面的window对象,再通过这个对象,获取到里面的DOM元素 js = ''' iframe = document.getElementById('ueditor_0'); iframe.contentWindow.document.body.innerHTML="hello"; ''' driver.execute_script(js) sleep(5) driver.quit()

练习

打开http://115.28.108.130/control.html

  1. 在"哈哈你输入不了"的输入框清空并输入"js开挂" (移除readonly属性)
  2. 点击"不可点击"按钮(移除disable属性)
  3. 为"第一个div"同级的table标签添加id="table1"

日期控件

1.逐个点击
2.用js修改为可输入,输入时间

练习

http://115.28.108.130/date.html
修改为可输入,并输入时间

上传下载

  1. 上传直接输入(不能输入用js修改), 下载直接点击
  2. 借助其他工具

练习

打开http://115.28.108.130/control.html, 上传文件

selenium宇宙之外

比如弹出上传下载windows对话框, flash操作, 保存网页

  1. 使用Autoit3/按键精灵编写脚本->生成exe->python执行exe
  2. 使用win32/win32gui操作windows窗口

常见错误怎么处理

  1. 看报什么错 1. 元素定位不到 2. 元素不可见
  2. 看有没有frame/iframe
  3. 操作前 sleep()
  4. 看看元素或者上级/上上级元素是否不可及

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!!

猜你喜欢

转载自blog.csdn.net/m0_59868866/article/details/130115276