web自动化04--webdriver API操作

哈喽,大家好!我是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")

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

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