selenium webDriver的运用
声明实例运行浏览器
配置浏览器驱动后,可以通过简单的2行代码就可以驱动浏览器(配置这里不加赘述)
from selenium import webdriver driver = webdriver.Chrome() driver.get("//www.baidu.com")
1.简单操作
1.1浏览器操作
driver.back()#后退 driver.forward()#前进 driver.refresh()#刷新
1.2浏览器窗口操作
driver.maximize_window()#浏览器最大化窗口 driver.minimize_window()#浏览器最小化窗口 driver.close()#关闭浏览器
driver.set_window_position(坐标X,坐标Y) #移动浏览器到坐标位置 driver.set_window_size(宽度像素,高度像素)#讲浏览器窗口设置指定大小 driver.set_window_rect(坐标X,坐标Y,宽度像素,高度像素)#将浏览器窗口移动到指定位置,同时设置窗口大小
1.3获取浏览器信息
print(driver.title) #百度一下,你就知道 print(driver.current_url) #//www.baidu.com/
#获取位置对象 driver.get_window_position() #获取大小对象 driver.get_window_size() #获取位置和大小对象 driver.get_window_rect()
2查找页面元素
#基本查找元素 from selenium.webdriver.common.by import By driver.find_element(By.ID,"kw").send_keys("") driver.find_element(By.NAME,"wd").send_keys("") driver.find_element(By.LINK_TEXT,"新闻").click()
xpath表达式
3元素基本操作
click
通常用于单击按钮(<button/>、<input type=”reset”/>、<input type=”submit”>)、链接(<a/>)、单选框(<input type=”radio”/>)、复选框(<input type=”checkbox”/>)等元素,但实际上对于页面上任何可见的元素,都可用click函数单击
send_keys
该函数一般用于输入框元素(<input type=”text”/><input type=”password”/><textarea/>)或文件上传元素(<input type=”file”/>),但理论上可以对任何可输入元素进行操作。
clear
和send_keys函数类似,clear函数多用于输入框元素。例如在百度搜索页面,我们可以先在百度搜索文本框中填入关键字,然后搜索。如果之后要再搜索其他关键字,就需要执行clear函数,先清空文本再输入关键字
下拉框
下拉框分为单选下拉框(<Select/>)和多选列表框(<Select multiple= “multiple”/>)
from selenium.webdriver.support.select import Select
sel=Select(driver.find_element(By.NAME,"cat_id")) sel.select_by_value("页面元素value数字") sel.select_by_index("使用下标") sel.select_by_visible_text("根据文本选择")
sel.deselect_all()#取消所有选
获取元素的基本属性
from selenium.webdriver.common.by import By baiduNewsLink = driver.find_element(By.XPATH,"//*[text()='新闻']") print(baiduNewsLink.text)#文本值 print(baiduNewsLink.tag_name)#标签类型 print(baiduNewsLink.is_selected())#元素是否选中 print(baiduNewsLink.is_enabled())#元素是否可以编辑 print(baiduNewsLink.is_displayed())#元素是否已经显示
处理浏览器弹框
弹窗一共有三类:alert(只有确定),confirm(有确定又取消),prompt(有确定有取消还可以输入值) alert不是一个方法是一个属性
ale=driver.switch_to.alert ale.accept()#点击确定 ale.dismiss()#点击取消
多网页切换
print(driver.current_window_handle)#打印当前正在操作的浏览器句柄 print(driver.window_handles)#打印实例下的所有句柄 driver.switch_to.window(driver.window_handles[0])#切换到第一个窗口句柄
4等待机制
通过函数设置等待的超时时间
driver.set_page_load_timeout(最长等待秒数)
改函数是全局设置,在整个实例周期都会生效
强制等待
强制等待很简单,直接使用PYthon的time函数即可
如下表示3秒延迟
import time time.sleep(3)
缺点:处理起来毫无弹性
元素级等待机制——隐式等待
这是Selenium最初版本就支持的等待方式。它的作用是在执行find_element…这类函数时增加一个宽限时间,它决定了查找元素时的最长等待时间
driver.implicitly_wait(等待秒数)
缺点:
- 全局使用
- 如果某个元素未定位到会完整的等待设置的最长时间,减缓了执行速度
- 很多页面有较多的异步刷新和操作,很多元素是动态的,都需要等待,用隐式也不太好
元素级等待机制——显式等待
元素级等待机制的最佳实践方式是显式等待,它是一种相当完美的等待机制。只需要指定条件判断函数,Selenium会每隔一定时间检测该条件是否成立。如果成立,就立刻执行下一步;否则,一直等待,直到超过最大等待时间,抛出超时异常
WebDriverWait(实例,超时秒数,检测时间间隔默认0.5秒)
from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By #这种场景下更适合使用Lambda表达式定义匿名函数 # WebDriverWait(driver,10).until(条件判断函数:等待到条件判断函数返回True) # WebDriverWait(driver,10).until_not(条件判断函数:等待到条件判断函数返回False) WebDriverWait(driver,10).until(lambda p: p.find_element(By.XPATH,"//*[text()='新闻']").is_displayed)
5.ActionChains——操作链
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("//www.baidu.com") ActionChains(driver).click(driver.find_element(By.XPATH,"//*[text()='新闻']")).perform()
- 使用操作链需要先导入ActionChains对象
- ActionChains传入webdriver实例
- 接着预约了单击操作,看清楚这里并没有执行单击操作,这是对操作进行设置
- perform:执行操作链中所有的操作,即之前预约的所有操作
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get("//www.baidu.com") # move_to_element会将鼠标指针放置在"设置"链接上,实现悬停效果 ActionChains(driver)\ .move_to_element( driver.find_element(By.XPATH, "//span[text()='设置']"))\ .pause(3)\ .perform() ActionChains(driver)\ .click(driver.find_element(By.LINK_TEXT, "搜索设置"))\ .pause(3)\ .perform() ActionChains(driver)\ .click(driver.find_element(By.ID, "s1_2"))\ .click(driver.find_element(By.ID, "SL_2"))\ .click(driver.find_element(By.ID, "sh_1"))\ .click(driver.find_element(By.LINK_TEXT, "保存设置"))\ .pause(3)\ .perform()
注:
操作链中涉及的所有WebElement元素在操作链执行时必须同时存在,且处于可操作状态,否则无法执行操作链。也就是说,在同一个操作链中,无法做到先操作某个元素,然后另一个新元素才显示,接着再操作这个新元素。
6.对页面窗口截图
driver.save_screenshot(截图文件保存路径)
7.对元素截图
driver.find_element(By.XPATH,"//*[text()='新闻']").screenshot(截图保存的路径)