1.操作浏览器
1 '''操作浏览器''' 2 3 from selenium import webdriver #从selenium里面的导入webdriver模块 4 import time #导入time模块 5 6 driver = webdriver.Firefox() #打开浏览器 7 driver.get("http://www.baidu.com") #打开访问的地址 8 9 title=driver.title #获取标题 10 print(title) 11 12 time.sleep(3) #设置等待时间3秒 13 driver.refresh() #刷新页面 14 15 driver.set_window_size(800,960) #设置屏幕宽度和高度 16 time.sleep(3) 17 driver.maximize_window() #屏幕最大化 18 driver.find_element_by_id("kw").send_keys(u"博客园花儿爷") #id定位并输入内容 19 driver.find_element_by_id("su").click() #点击事件 20 driver.back() #上一页 21 time.sleep(3) 22 driver.forward() #下一页 23 24 driver.get_screenshot_as_file("C:\\Users\\12978\Desktop\\1r.jpg") #截屏保存文件 25 26 driver.close() #关闭当前窗口 27 driver.quit() #关闭浏览器'''
2.操作元素(鼠标、键盘事件)
1.鼠标操作元素
1.输入字符串,如果输入中文,前面加u:send_keys(u"上海")
2.点击事件: driver.find_element_by_id("su").click()
3.清楚输入框:clear()
4.回车键模拟提交表单:submit提交表单
2.模拟键盘事件
1.模拟键盘enter键使用submit()方法
driver.find_element_by_id("su").submit()
2.导入键盘模块
From selenium.webdriver.common.keys import Keys
3.模拟enter键
driver.find_element_by_id("su").send_keys(Keys.ENTER)
其他键盘操作如下:
键盘F1到F12: send_keys(Keys.F1) 把F1改成对应键
复制Ctrl+C: send_keys(Keys.CONTROL,’C’)
粘贴Ctrl+V: send_keys(Keys.CONTROL,’V’)
全选Ctrl+A: send_keys(Keys.CONTROL,’A’)
剪切Ctrl+X: send_keys(Keys.CONTROL,’X’)
制表键Tab:send_keys(Keys.TAB)
'''模拟键盘操作''' #从selenium里面的导入webdriver模块 from selenium import webdriver from selenium.webdriver.common.keys import Keys #键盘模拟模块 import time #导入time模块 driver = webdriver.Firefox() driver.get("http://www.baidu.com") driver.find_element_by_id("kw").send_keys("python") #id定位并输入内容 time.sleep(3) driver.find_element_by_css_selector("#kw").send_keys(Keys.CONTROL,'a') #键盘全选操作 Ctrl+A driver.find_element_by_css_selector("#kw").send_keys(Keys.CONTROL,'c') #键盘选择复制 driver.find_element_by_css_selector("#kw").send_keys(Keys.CONTROL,'x') #键盘选择剪切 driver.get("http://www.sogou.com/") time.sleep(3) driver.find_element_by_css_selector(".sec-input").send_keys(Keys.CONTROL,'v') #粘贴复制内容 time.sleep(2) driver.find_element_by_css_selector("#stb").send_keys(Keys.ENTER) #点击搜索按钮 time.sleep(3) driver.quit()
3.鼠标悬停事件
1.鼠标不仅仅可以点击(click),鼠标还有其它的操作,如:鼠标悬停在某个元素上,鼠标右击,鼠标按住某个按钮拖到
2.鼠标事件需要先导入模块:from selenium.webdriver.common.action_chains import ActionChains
perform() 执行所有ActionChains中的行为
move_to_element() 鼠标悬停
右击鼠标:context_click()
双击鼠标:double_click()
'''鼠标悬停''' from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains #鼠标事件模块 from time import sleep driver=webdriver.Firefox() driver.get("http://www.baidu.com") driver.maximize_window() driver.find_element_by_css_selector("#kw").send_keys("Python") # 获取搜索框元素对象 element=driver.find_element_by_css_selector("#kw") sleep(3) ActionChains(driver).double_click(element).perform() #双击操作 sleep(2) ActionChains(driver).context_click(element).perform() #右击操作 sleep(3) #鼠标悬停 mouse=driver.find_element_by_link_text("设置") ActionChains(driver).move_to_element(mouse).perform() #鼠标悬停执行action chains中的行为 driver.find_element_by_link_text("搜索设置").click() sleep(4) driver.quit()
3.元素等待
概念
- 显示等待是针对某一个元素进行相关等待判定;
- 隐式等待不针对某一个元素进行等待,全局元素等待。
a.相关模块
- WebDriverWait 显示等待针对元素必用
- expected_conditions 预期条件类(里面包含方法可以调用,用于显示等待)
- NoSuchElementException 用于隐式等待抛出异常
- By 用于元素定位
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 selenium.common.exceptions import NoSuchElementException
'''元素等待''' #显示等待 ''' from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from time import sleep driver=webdriver.Firefox() driver.get("http://www.baidu.com") driver.find_element_by_css_selector("#kw").send_keys("Selenium") sleep(2) element=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,"su"))) #显示等待--判断搜索按钮是否存在 element.click() sleep(3) driver.quit() ''' #隐式等待 from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from time import sleep,ctime driver=webdriver.Firefox() driver.get("http://www.baidu.com") sleep(2) driver.implicitly_wait(5) #隐式等待时间设定 5秒 #检测搜索框是否存在 try: print(ctime()) driver.find_element_by_css_selector("#kw").send_keys("Python") driver. find_element_by_css_selector("#su").click except NoSuchElementException as msg: print(msg) finally: print(ctime()) sleep(3) driver.quit()
4.多窗口切换
浏览器窗口的属性用句柄(handle)
from selenium import webdriver import time webdriver=webdriver.Firefox() webdriver.get("http://bj.ganji.com/") time.sleep(2) h = webdriver.current_window_handle #获取当前页面的句柄 print(h) webdriver.find_element_by_link_text("工作").click() all_h=webdriver.window_handles print(all_h) #切换句柄 webdriver.switch_to_window(all_h[1]) #获取list里面第二个直接切换 print(webdriver.title) webdriver.close() webdriver.switch_to_window(h) #切换首句柄 print(webdriver.title) webdriver.quit()
5.select下拉框定位
elect_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() :返回所有的选项
'''select下拉框''' from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains #鼠标事件模块 from selenium.webdriver.support.select import Select #下拉框索引定位所需模块 from time import sleep driver=webdriver.Firefox() driver.get("http://www.baidu.com") driver.implicitly_wait(20) #鼠标悬停到百度的设置按钮上 mouse=driver.find_element_by_link_text("设置") ActionChains(driver).move_to_element(mouse).perform() #鼠标悬停执行action chains中的行为 driver.find_element_by_link_text("搜索设置").click() sleep(4) ''' #1.select框定位 #二次定位:分两步:先定位下拉框,在点击选项 s=driver.find_element_by_id("nr") s.find_element_by_xpath("//option[@value='50']").click() #driver.find_element_by_id("nr").find_element_by_xpath("//option[@value='50']").click() #第二种写法,合并一步完成 #driver.find_element_by_xpath(".//*[@id='nr']/option[2]").click() #自己写xpath一次定位,索引值从1算起 #2.select模块根据属性或者索引定位 s=driver.find_element_by_id("nr") #通过索引,索引值从0算起 Select(s).select_by_index(2) s=driver.find_element_by_id("nr") #通过属性值定位 Select(s).select_by_value(20) ''' s=driver.find_element_by_id("nr") #通过text文本内容定位 Select(s).select_by_visible_text("每页显示50条") #driver.quit()
6.alert弹窗
text:获取文本值
accept() :点击"确认"
dismiss() :点击"取消"或者叉掉对话框
send_keys() :输入文本值 --仅限于prompt,在alert和confirm上没有输入框
'''alert\confirm\prompt''' from selenium import webdriver from time import sleep url="C:\\Users\\12978\\Desktop\\alert.html" driver=webdriver.Firefox() driver.get(url) sleep(4) driver.find_element_by_id("alert").click() #定位按钮 sleep(3) t=driver.switch_to_alert() #获取弹窗文本内容 print(t) t.accept() #点击弹框确认按钮 #t.dismiss() #相当于x,取消 sleep(3)
7.上传图片、文件
上传过程一般要打开一个系统的windows窗口,从窗口选择本地文件添加。所以一般会卡在如何操作本地window窗口。解决的方法很简单,只需要定位到上传按钮,然后通过send_keys添加本地文件路径即可
from selenium import webdriver from time import sleep driver=webdriver.Firefox() driver.get("http://www.baidu.com") driver.find_element_by_css_selector(".soutu-btn").click() sleep(3) driver.find_element_by_css_selector(".upload-pic").send_keys(r"C:\\Users\\12978\Pictures\\12.jpg")
#上传文件
#driver.find_element_by_xpath("//*[@type='file']").send_keys("D:\测试文档\绘本\单词.zip")
sleep(3) # driver.quit()
8.滚动条
'''滚动条''' from selenium import webdriver from time import sleep url="https://www.baidu.com/" driver=webdriver.Firefox() driver.get(url) sleep(3) driver.maximize_window() driver.find_element_by_id("kw").send_keys(u"博客园花儿爷") #id定位并输入内容 driver.find_element_by_id("su").click() js="var action=document.documentElement.scrollTop=10000" driver.execute_script(js) sleep(2) #将滚动条拖到最顶部 js="var action=document.documentElement.scrollTop=0" driver.execute_script(js) sleep(3) driver.quit()
9.日历控件
from selenium import webdriver driver = webdriver.Firefox() driver.get("https://kyfw.12306.cn/otn/index/init") # 去掉元素的readonly属性 js = 'document.getElementById("train_date").removeAttribute("readonly");' driver.execute_script(js) # 用js方法输入日期 js_value = 'document.getElementById("train_date").value="2018-07-23"' driver.execute_script(js_value) # driver.find_element_by_id("train_date").clear() # 清空文本后输入值 # driver.find_element_by_id("train_date").send_keys("2018-07-23")