环境搭建步骤
-
安装selenium
pip install selenium -
安装浏览器
-
安装浏览器驱动
谷歌浏览器:chromdriver.exe
ie浏览器:ieserverdriver.exe
FireFox浏览器:geckodriver.exe
特别注意⚠️:下载驱动版本必须与浏览器版本一致下载地址
-
淘宝镜像:https://npmmirror.com/chromedriver
-
https://chromedriver.storage.googleapis.com/index.html
-
火狐driver:https://github.com/mozilla/geckodriver/releases
-
ie driver:https://seleniumrelease.storage.googleapis.com/index.html
chromedriver.exe文件放置在python安装路径(python.exe所在路径)
mac环境下搭建selenium参考:https://www.cnblogs.com/hq0202/p/16273590.html
chrome 131版本驱动下载地址:https://googlechromelabs.github.io/chrome-for-testing/#stable
浏览器常用操作
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
#浏览器最大化
driver.maximize_window()
#最小化
driver.minimize_window()
#指定窗口大小
driver.set_window_size(2000,800)
#浏览器前后退
driver.forward()
driver.back()
#浏览器标题及url,获取页面资源(断言)
print(driver.title,driver,current_url,driver.page_source)
#截图
driver.get_screenshot_as_file("保存图片路径")
#浏览器
driver.close()
driver.quit()
元素定位
driver.find_element_by_id()#通过id定位
driver.find_element_by_name()#通过name定位
driver.find_element_by_tag_name()#通过html标签定位,一般情况下不使用这个
driver.find_element_by_link_text()#通过链接文本定位,就是超链接的文本内容
driver.find_element_by_partial_link_text()#通过部分链接文本定位
driver.find_element_by_class_name()#通过类名定位
返回元素列表[]
driver.find_elements_by_partial_link_text()
driver.find_elements_by_id()#通过id定位
driver.find_elements_by_name()#通过name定位
driver.find_elements_by_class_name()#通过类名定位
driver.find_elements_by_tag_name()#通过html标签定位
xpath定位
绝对路径定位
使用浏览器右键复制绝对路径
绝对路径定位一般不要用,要考虑元素的稳定性
相对路径定位
//开头
- 标签+索引定位
//form/span[1]/input - 唯一定位标签+单个属性
//form[@id=‘form’]/span[1]/input[@id=‘kw’] - 唯一定位标签+多个属性
多个属性使用and
//form[@id=‘form’ and @name=‘f’]/span[1]/input - 标签+部分属性定位
//form/span[1]/input[substring(@class,3)=‘ipt’]
//form/span[1]/input[contains(@class,‘ipt’)]
//input[starts-with(@id,‘k’)] - 通过文本定位
//a[text()=‘新闻’]
实例
路径表达式 | 结果 |
---|---|
bookstore | 选取 bookstore 元素的所有子节点 |
/bookstore | 选取根元素 bookstore。 |
bookstore/book | 选取属于 bookstore 的子元素的所有 book 元素。 |
//book | 选取所有 book 子元素,而不管它们在文档中的位置。 |
bookstore//book | 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 |
//@lang | 选取名为 lang 的所有属性。 |
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()< 3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素 |
//title[@lang=‘eng’] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
chrome开发者工具定位元素:
在console中进行调试:
$x 可以通过xpath表达式进行定位
$$ 可以通过css选择器进行定位
调试常用操作:
修改元素的属性:$x(“xx”)[0].attr=“”
点击某个元素: $$(“xxx”)[0].click()
css定位
- 通过绝对路径定位,一般不用
driver.find_element_by_css_selector(“”) - 通过id定位
driver.find_element_by_css_selector(“#kw”) - 通过class定位
driver.find_element_by_css_selector(“.s_ipt”) - 通过属性定位
driver.find_element_by_css_selector(“[autocompplete=‘off’]”)
driver.find_element_by_css_selector(“[autocompplete=‘off’][class=‘s_ipt’]”) - 通过标签定位 标签名+属性/id/class定位
driver.find_element_by_css_selector(“input#kw”)
driver.find_element_by_css_selector(“input.s_ipt”)
driver.find_element_by_css_selector(“input[autocompplete=‘off’]”) - 通过层级定位 层级之间通过>或者空格隔开
driver.find_element_by_css_selector(“form>span>input”) - 通过兄弟节点定位
场景:同一个元素下面有多个相同的元素
第一个元素标签:first-child
第n个元素标签:nth-child(n)
最后元素标签:last-child
driver.find_element_by_css_selector(“div#s-top-left>a:first-child”)
1.定位元素名为tag的元素:tag 对应于xpath ://tag
2.属性限制表达式
- 拥有attr属性的任意元素 [attr] ----对应于xpath : //*[@attr]
- 拥有attr属性的tag元素。tag[attr] ---- 对应于xpath: //tag[@attr]
- attr=value [attr=value]---- 对应于xpath: //*[@attr=‘value’]
- css没有用元素内容进行定位的选择器 xpath://tag[text()=“元素内容”]
例子 | 描述 |
---|---|
.intro | 选择class=intro的所有元素 |
#firstname | 选择id=firstname的所有元素 |
* | 选择所有元素 |
p | 选择所有 元素 |
div,p | 选择所有
和
的所有元素 |
div p | 选择所有
元素内部的所有
元素 |
div>p | 选择父元素为
元素的所有
元素 |
div+p | 选择紧接在
元素之后的所有
元素 |
[target] | 选择带有target属性所有元素 |
[target=_blank] | 选择targer=“_blank"的所有元素 |
p:nth-child(2) | 选择属于其父元素的第二个子元素的每个 元素 |
支持所有定位方式
from selenium.webdriver.common.by import By
driver.find_element(By.xpath,“xx”)
元素的常用操作
四大操作:
- 点击 click()
- 输入 send_keys()
- 获取文本 text
- 获取属性 get_attribute()
等待方式
直接等待
缺点:
- 使用死板,难以衡量具体等待时间,有时间等待也解决不了问题
解决方案:在报错元素操作之前添加等待
原理:强制等待,线程休眠一段时间
隐式等待
隐式等待只能解决元素查找问题,不能解决元素交互问题
问题:难以确定元素加载的具体时间
原理:设置一个等待时间,轮询查找元素是否出现,如果没有出现就抛出异常
隐式等待无法解决的问题
- 元素可以找到,使用点击等操作,出现报错
- 原因:
- 页面元素加载是异步加载过程,通常会html先加载完成,js,css其后
- 元素存在与否是由html决定,元素的交互是由css或js决定
- 隐式等待只关注元素能否找到,不关注元素能否点击或者进行其他的交互
- 解决方案:使用显示等待
显示等待
WebDriverWait(driver实例, 最长等待时间, 轮询时间).until(结束条件)
原理:在最长等待时间内,轮询,是否满足结束条件
多窗口处理
- 先获取到当前窗口句柄(driver.current_window_handle)
- 再获取到所有的窗口句柄(driver.window_handles)最早打开的窗口在列表最前面
- 判断是否想要操作的窗口,如果是,就可以对窗口进行操作;如果不是就跳转到另一个窗口(driver.switch_to_window);
driver.switch_to_window(win[-1])//切换至最后一个窗口