一、安装
安装selenium库,pip install selenium
安装特定于浏览器的WebDriver二进制文件(如,谷歌的chromedriver),需添加系统path环境变量(简单方式:直接将chromedriver放在python目录下)
Selenium通过使用WebDriver支持市场上所有主流浏览器的自动化。
WebDriver(驱动程序)是一个API和协议,用于控制web浏览器的行为。
实例化Chrome会话
from selenium import webdriver driver=webdriver.Chrome()
二、定位元素
WebDriver中有8种不同的内置元素定位策略:
id、name、xpath、css selector、link text、partial link text、class name、tag name、
WebElement表示DOM元素,网络元素
find_element_by_xx("xxx")
find_elements_by_xx("xxx")
find_element("xx","xxx")定位一个元素:driver.find_element(By.NAME,"值") #同driver.find_element("name","值")
find_elements("xx","xxx")定位一组元素:driver.find_elements(By.TAG_NAME,"值") #同driver.find_elements("tag name","值")
xpath语法:driver.find_element_by_xpath(
"//*[@class='s_ipt']"
).send_keys(
"xi"
)
driver.find_element_by_xpath(
"//input[@class='s_ipt']"
).send_keys(
"xi"
)
//表示相对位置;/表示层级;*表示任意标签,也可以通过标签筛选下(input);[]可以填写任意属性;
class定位:一个元素可以有多个class的属性名称(如,新闻按钮:class="mnav c-font-normal c-color-t"),使用空格作为间隔符号
直接定位driver.find_elements_by_class_name("mnav c-font-normal c-color-t"),定位不到,可以取其中的一个属性:如,mnav 或 c-font-normal 或 c-color-t
xpath定位的话,直接使用带空格的class属性值
driver.find_elements_by_xpath("//div[@id='s-top-left']/a[@class='mnav c-font-normal c-color-t']") #只取部分,定位不到
css定位的话,可以使用多个class属性,也可以使用单个class属性,使用.表示class属性,#表示id属性
driver.find_elements_by_css_selector(".mnav.c-font-normal.c-color-t")
driver.find_elements_by_css_selector(".mnav")
driver.find_elements_by_css_selector("[class='mnav c-font-normal c-color-t']") #只取部分,定位不到
css定位:driver.find_element_by_css_selector("#kw").send_keys(字符串");
driver.find_element_by_css_selector(" [autocomplete='off']").send_keys("字符串")
driver.find_element_by_css_selector("input [autocomplete='off']").send_keys("字符串")
#表示id;.表示class属性;标签无任何标识符;任意属性[id='kw'] 或 [autocomplete='off']
()内写入:#id的值 或 .class的值 或 标签 或 [id='kw']
>层级;*表示任意标签
#点击新闻按钮 # driver.find_elements_by_xpath("//div[@id='s-top-left']/a")[0].click() # driver.find_elements_by_css_selector("div#s-top-left>a")[0].click() driver.find_elements_by_css_selector("*#s-top-left>a")[0].click() # driver.find_element_by_css_selector("div[id='s-top-left']>a:nth-child(1)").click()
获取元素相关的值:t=driver.find_element_by_id("id值")
获取元素的文本属性:t.text;
获取元素的某属性值:t.get_attribute("属性名")
获取输入框的文本值:t.get_attribute("value")
获取元素的标签:t.tag_name
获取页面title:driver.title
获取浏览器名称:driver.name
获取页面源码:s=driver.page_source #可以配合re,提取需要的值 re.findall(正则表达式,s)
输入框输入字符串:.send_keys()
清空输入框内容:.clear()
鼠标左键点击:.click()
回车键:.submit()
切换(浏览器)窗口/标签:n=driver.window_handles;driver.switch_to.window(n[-1])
切换iframe:定位 t=driver.find_element_by_xpath("iframe的路径");切换 driver.switch_to.frame(t);#释放iframe,返回主页面:driver.switch_to.default_content()
处理富文本:切换到iframe ;定位、操作(和普通的输入框是一样);释放iframe;
处理弹窗alerts/confirm/prompt:t=driver. switch_to.alert();t.accept(),t.dismiss(),t.send_keys("内容")
单选框:.click()
复选框:.click();可以先判断是否勾选:.is_selected() 未选中是False,选中是True
select下拉框:和普通的定位是一样的 .click()
table表格:和常见操作一样的
上传图片:(input标签的图片)定位、上传 driver.find_element_by_id("id的值").send_keys("E:\qq.png")
三、等待
显示等待:导入模块:from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait与until、until_not、expected_conditions、匿名函数结合使用
导入expected_conditions模块:from selenium.webdriver.support import expected_conditions as EC
w=WebDriverWait(driver,10)
w.until(EC.presence_of_element_located(("id","kw")).send_keys("he")
w.until(lambda x:x.find_element_by_id("kw")).send_keys("he")
强制等待:import time
sleep(5) #等待5秒
隐式等待:driver.implicitly_wait(10) #隐式等待10秒
四、判断元素是否存在
1.可以写一个方法 使用到find_elements("id","kw") ;查看返回值(集合)的长度,长度为0,则被找到;长度为1,找到1个;长度>1,找到多个;
2.使用expected_conditions;
EC.title_is("xx")(driver) #判断当前页面的title是否完全等于(==)预期字符串
EC.title_contains("x"(driver) #包含
presence_of_element_located:判断某个元素是否被加到dom树里,并不代表该元素一定可见
alert_is_present()(driver):#判断页面上是否存在alert
EC.text_to_be_present_in_element(("xx","xxx"),"期望内容")(driver)#判断文本,返回True 或 Fasle #("xx","xxx")即locator,语法同find_element()括号中内容
EC.text_to_be_present_in_element_value(("xx","xxx"),"期望内容")(drvier) #判断这个期望的内容与定位的value属性的值一样?
捕获异常:为了让程序继续执行,可以使用try...except捕获异常
try:
。。。
except Exception as e:
print(e)
五、截图
截取全屏
driver.save_screenshot("D:\a.png")
driver.save_screenshot_as_file("D:/b.png")
截取某个元素的图
方式1:定位元素,保存图片
s=driver.find_element_by_id("kw")
s.screenshot("E:\991.png")
方式2:定位元素,获取坐标x,y,尺寸宽、高
from PIL import Image
t=driver.find_element_by_id("kw")
元素坐标:s.location,元素大小:t.size
i=Image.open("D:/b.png")
i.crop(t.location['x], t.location['y'], t.location['x']+t.size['width'], t.location['y']+t.size['height'])
i.save("D:\c.png")
六、js操作
定位:单数:Id;复数:Name,ClassName,TagName
去掉x属性:j='document.getElementById("id属性的值").removeAttribute("x")’
修改x属性值为空:j='document.getElementsByClassName("class属性的值")[0].x=""'
控制浏览器滚动条滚动到底部、顶部:'window.scrollTo(0,document.body.scrollHeight)' ;'window.scrollTo(0,0)'
富文本填写内容:
js="window.document.getElementsByTagName('iframe')[0].contentWindow.document.body.innerHTML='{}'".format("js填写的富文本")
输入框填写内容:.value="内容"
清空输入框内容:.value=""
处理内嵌div滚动条:j='document.getElementById("xx").scrollTop=0' #顶部;底部.scrollTop=1000
j='document.getElementsByName("yy").scrollLeft=0' #左侧;右侧.scrollLeft=1000
执行js:driver.execute_script(j)
from selenium import webdriver import time driver=webdriver.Chrome() driver.get("https://www.baidu.com") js='document.getElementById("kw").value="xixi"' #单数 #发送文本 # js='document.getElementsByName("wd")[0].value="hello"' #复数 # js='document.getElementsByClassName("s_ipt")[0].value="good"' # js='document.getElementById("kw").removeAttribute("autocomplete")' #去掉autocomplete属性 # js='document.getElementsByName("wd")[0].autocomplete=""' #修改autocomplete属性值为空 # js='window.scrollTo(0,document.body.scrollHeight)'#滚动条 滚动到底部 # driver.execute_script(js) # time.sleep(6) # js='window.scrollTo(0,0)'#滚动条 滚动到顶部 #js填写富文本的信息 # js="window.document.getElementsByTagName('iframe')[0].contentWindow.document.body.innerHTML='{}'".format("js填写的富文本") driver.execute_script(js) js='document.getElementById("su").click()' #点击百度一下 driver.execute_script(js) time.sleep(3) js='document.getElementById("kw").value=""' #清空搜索框的内容 driver.execute_script(js)
七、浏览器导航
打开网站:driver.get(url)
获取当前url:driver.current_url
后退:driver.back()
前进:driver.forward()
刷新:driver.refresh()
获取标题:driver.title
窗口和标签页:当前窗口的id,id=driver.current_window_handle
所有窗口的id集合,ids=driver.window_handles
切换窗口或标签页:switch_to.window(ids[-1])
关闭窗口或标签页:driver.close()
退出浏览器:driver.quit()
切换到frame或iframe上:
方式1:定位框架元素;切换到该框架driver.switch_to.frame(元素);操作框架里的元素
方式2:通过name或id切换框架driver.switch_to.frame(name或id属性值);操作框架里的元素
方式3:使用索引,如切换到第2个框架driver.switch_to.frame(1)
离开框架:切换到默认内容,driver.switch_to.default_content()
获取窗口大小:driver.get_window_size().get("width")
driver.get_window_size().get("height")
设置窗口大小:driver.set_window_size(1024,768)
得到窗口的位置:
driver.get_window_position().get('x)
driver.get_window_position().get('y')
设置窗口位置:driver.set_window_position(0,0)
最大化窗口:driver.maximize_window()
最小化窗口:driver.mimimize_window()
全屏窗口(类似F11):driver.fullscreen_window()
屏幕截图:driver.save_screenshot("E:\a.png")
元素屏幕截图:如百度搜索框
driver.find_element_by_id("kw").screenshot("a.png")
八、JavaScript 提供的三种类型的原生弹窗消息,警告框,提示框和确认框
Alerts 警告框、Confirm 确认框、Prompt 提示框
切换到弹窗:a=driver.switch_to.alert
获取弹出中的文本:a.text
确定按钮:a.accept()
取消按钮:a.dismiss()
提示框,输入内容:a.send_keys(你想要输入的字符串)
九、键盘事件Keyboard、鼠标事件Mouse;PyUserInput模块下的PyKeyboard、PyMouse
键盘事件
方式1:
需要导入键盘模块:from selenium.webdriver.common.keys import Keys
操作回车按钮:driver.find_element("id","值").send_keys(Keys.ENTER)
Ctrl+C:send_keys(Keys.CONTROL,"c")
制表键Tab:send_keys(Keys.TAB)
方式2:
导入 键盘模块:from pykeyboard import PyKeyboard
kb=PyKeyboard()
# kb.press_key(kb.tab_key) #按下tab键
# kb.release_key(kb.tab_key) #释放tab键
kb.tap_key(kb.tab_key) #按下tab键、释放tab键
kb.tap_key("h") #输入字符h
kb.tap_key(kb.enter_key) #回车键
鼠标事件
方式1:
需要导入鼠标模块:from selenium.webdriver.common.action_chains import ActionChains
i=driver.find_element_by_id("值")
鼠标悬停在某元素上:ActionChains(driver).move_to_element(i).perform()
左键单击某元素且不释放:ActionChains(driver).click_and_hold(i).perform()
释放按下的鼠标左键,它将释放给定WebElement上按下的鼠标左键:ActionChains(driver).release().perform()
右键单击:ActionChains(driver).context_click(i).perform()
双击 :ActionChains(driver).double_click(i).perform()
方式2:
导入鼠标模块:from pymouse import PyMouse
十、cookie
Cookie是从网站发送并存储在您的计算机中的一小段数据。Cookies主要用于识别用户并加载存储的信息。
添加Cookie:driver.add_cookie({"name":"值1", "键2":"值2",...}) #可以使用代码登录,手动输入验证码,获取所有cookie,然后取出需要的部分,添加cookie时,使用
获取指定name的Cookie:driver.get_cookie(name="值1")
获取全部Cookies:driver.get_cookies()
删除指定Cookie:driver.delete_cookie(name="值1") #"name="可省略
删除所有cookies:driver.delete_all_cookies()
十一、显示浏览器、静默模式启动浏览器 不显示浏览器
from selenium import webdriver
driver=webdriver.Chrome() #启动浏览器,显示浏览器
option=webdriver.ChromeOptions()
option.add_argument('headless')
d=webdriver.Chrome(options=option) #不显示浏览器