Selenium自动化测试第二天(下)

目录

更多学习资料请加添加作者微信:lockingfree获取

动作链 模拟鼠标操作

  • 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模拟键盘

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. 看看元素或者上级/上上级元素是否不可及

此为北京龙腾育才 Python高级自动化(Selenium部分)授课笔记
课程介绍
想要参加现场(北京)/网络课程的可以联系作者微信:lockingfree

  1. 高效学习,快速掌握Python自动化所有领域技能
  2. 同步快速解决各种问题
  3. 配套实战项目练习
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容