selenium合集

环境搭建步骤

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/span1/input
  • 唯一定位标签+单个属性
    //form@id='form'/span1/input@id='kw'
  • 唯一定位标签+多个属性
    多个属性使用and
    //form@id='form' and @name='f'/span1/input
  • 标签+部分属性定位
    //form/span1/inputsubstring(@class,3)='ipt'
    //form/span1/inputcontains(@class,'ipt')
    //inputstarts-with(@id,'k')
  • 通过文本定位
    //atext()='新闻'

实例

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点
/bookstore 选取根元素 bookstore。
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。
/bookstore/book1 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/booklast() 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/booklast()-1 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/bookposition()\< 3 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title@lang 选取所有拥有名为 lang 的属性的 title 元素
//title@lang='eng' 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/bookprice\>35.00 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/bookprice\>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("inputautocompplete='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元素。tagattr ---- 对应于xpath: //tag@attr
  • attr=value attr=value---- 对应于xpath: //*@attr='value'
  • css没有用元素内容进行定位的选择器 xpath://tagtext()="元素内容"
例子 描述
.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(结束条件)

原理:在最长等待时间内,轮询,是否满足结束条件


多窗口处理

  1. 先获取到当前窗口句柄(driver.current_window_handle)
  2. 再获取到所有的窗口句柄(driver.window_handles)最早打开的窗口在列表最前面
  3. 判断是否想要操作的窗口,如果是,就可以对窗口进行操作;如果不是就跳转到另一个窗口(driver.switch_to_window);

driver.switch_to_window(win-1)//切换至最后一个窗口

相关推荐
顾林海1 小时前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱4 小时前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽9 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码9 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱19 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵20 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio1 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户0332126663671 天前
使用 Python 从零创建 Word 文档
python
Csvn1 天前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate