selenium webDriver的运用

声明实例运行浏览器

配置浏览器驱动后,可以通过简单的2行代码就可以驱动浏览器(配置这里不加赘述)

from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.baidu.com")

1.简单操作

1.1浏览器操作

selenium webDriver的运用

 

 

 

driver.back()#后退 driver.forward()#前进 driver.refresh()#刷新

1.2浏览器窗口操作

selenium webDriver的运用

 

 

 

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) #https://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表达式
/子节点
//任意位置
*任意元素
.当前节点 ..父级极点
子节点稳定//*[@属性=“属性值”]/.. 这样就可以向上找到节点在往上继续/.. 然后往下找div[索引]
following-sibling::同节点最近的下一个(小哥)
preceding-sibling::同节点最近的上一个(大哥)
@代表属性
格式
属性://*[@属性=“属性值”]
文本://*[text()='文本值']
模糊查询 [ contains(@属性/text(),“值”)]
starts_with(@属性/text(),“值”):以xxx开始 :属性,文本值
多条件查询and:
//*[@属性=‘值’ and@属性=‘值’ ]
svg元素
//*[name()='svg']

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(等待秒数)

缺点:

  1. 全局使用
  2. 如果某个元素未定位到会完整的等待设置的最长时间,减缓了执行速度
  3. 很多页面有较多的异步刷新和操作,很多元素是动态的,都需要等待,用隐式也不太好
元素级等待机制——显式等待

元素级等待机制的最佳实践方式是显式等待,它是一种相当完美的等待机制。只需要指定条件判断函数,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("https://www.baidu.com") ActionChains(driver).click(driver.find_element(By.XPATH,"//*[text()='新闻']")).perform()

  1. 使用操作链需要先导入ActionChains对象
  2. ActionChains传入webdriver实例
  3. 接着预约了单击操作,看清楚这里并没有执行单击操作,这是对操作进行设置
  4. 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("https://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(截图保存的路径)

 

发表评论

相关文章