首页 > 其他分享 >Selenium Web Driver的基本运用

Selenium Web Driver的基本运用

时间:2024-02-11 17:33:21浏览次数:32  
标签:Web get Selenium 元素 driver element 获取 Driver find

Selenium Web Driver的基本运用

目录

浏览器窗口的基本操作

浏览器导航操作

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

前进、后退、刷新

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

浏览器窗口操作

最小化、最大化、关闭窗口

driver.minimize_window() # 最小化窗口
driver.maximize_window() # 最大化窗口
driver.close() # 关闭窗口

区别quit()和close()

quit():也会结束driver这个实例,窗口也会关闭,后续不可以接着使用driver实例

close():窗口会关闭,driver实例不会关闭,后续还可以接着使用

调整窗口位置与大小

driver.set_window_position(100, 100) # 移动到指定位置
driver.set_window_size(1000, 1000) # 调整大小
driver.set_window_rect(100, 100, 1000, 1000) # 移动并调整

休眠

time.sleep(3) # 单位s

获取浏览器信息

获取标题、网址

driver.title # 获取标题
driver.current_url # 获取网址

获取位置、大小

driver.get_window_position() # 获取位置
driver.get_window_size() # 获取大小
driver.get_window_rect() # 获取位置和大小

返回的是字典,这样提取

print("获取位置对象:", driver.get_window_position())
print("获取位置坐标x值:", driver.get_window_position()["x"])
print("获取位置坐标y值:", driver.get_window_position()["y"])
获取位置对象: {'x': 9, 'y': 9}
获取位置坐标x值: 9
获取位置坐标y值: 9

查找页面元素

按id查找

找到第一个匹配的

driver.find_element_by_id("id属性值")

比如说找到了一个输入框,可以往里面填数据send_keys

searchTextBox = driver.find_element_by_id("kw")
searchTextBox.send_keys("Hello World")

按name查找

driver.find_element_b_name("name属性值")

按class查找

driver.find_element_by_class_name("class属性值")

id或者name常作为唯一标识,class则不会,故还得先判断是否重复

按链接文本查找

driver.find_element_by_link_text("链接的文本")

按链接文本模糊查找

多了一个partial

driver.find_element_by_partial_link_text("链接的一部分文本")

按标签类型查找

driver.find_element_by_tag_name("HTML标签名称")

按XPath查找

html节点的选取

driver.find_element_by_xpath("XPath表达式")
  1. 绝对路径、相对路径

    driver.find_element_by_xpath("/html/body/div/div/div/div/div/form/span/input") # 绝对路径
    
    driver.find_element_by_xpath("//span/input") # 相对路径 健壮性稍好
    

    缺点:匹配的元素可能有多个

  2. 索引、属性

    索引

    driver.find_element_by_xpath("//span/input[1]")
    driver.find_element_by_xpath("//span/input[last()]")
    

    属性

    根据属性名称来取得期待值,与之前的id、name、class挂钩

    driver.find_element_by_xpath("//input[@id='kw']")
    driver.find_element_by_xpath("//input[@name='wd']")
    driver.find_element_by_xpath("//input[@class='s_ipt']")
    driver.find_element_by_xpath("//*[@id='kw']") # 还可以使用通配符
    
  3. 基于轴定位

    相邻关系查找,向前,向后

    driver.find_element_by_xpath("//span[@class='soutu-btn']/following::input[1]")  
    # 找到之后的第一个input元素
    driver.find_element_by_xpath("//a[@id='quickdelete']/preceding::input[1]")  
    # 找到之前的第一个input元素
    driver.find_element_by_xpath("//input[@id='su']/parent::span/parent::form//input[@id='kd']")  
    # 找到父级元素span,再找到父级元素form,再找到id为wd的input元素
    
  4. 基于函数或表达式定位

    driver.find_element_by_xpath("//a[text()='hao123']")  
    # 查找文本为hao123的元素
    driver.find_element_by_xpath("//a[contains(@href, 'www.hao123.com')]") 
    # 查找href属性包含www.hao123.com的a元素
    driver.find_element_by_xpath("//a[contains(text(), 'ao12')]")  
    # 查找文本包含ao12的a元素
    driver.find_element_by_xpath("//a[starts-with(@href, 'https://www.hao')]")  
    # 查找href属性以https://www.hao开始的a元素
    

    逻辑表达式

    driver.find_element_by_xpath("//a[@name=errorname' or 'text()='hao123']")
    # 查找name属性为errorname或者文本为hao123的元素
    driver.find_element_by_xpath("//a[contains(@href, 'hao123' and text()='hao123']")
    # 查找href属性包含hao123并且文本等于hao123的元素
    

    浏览器开发者工具F12中也可使用xpath表达式

    $x("XPATH表达式")

按CSS选择器查找

driver.find_element_by_css_selector("CSS选择器")
  1. 层级关系定位

    driver.find_element_buy_css_selector("html > body > div > div >div > div > div > form > span > input")
    
  2. 关键属性定位

    driver.find_element_by_css_selector("#kw")
    # id为kw
    driver.find_element_by_css_selector(".s_ipt")
    # class为s_ipt
    driver.find_element_by_css_selector("[name=wd]")
    # name为wd
    
  3. 基于属性进行模糊定位

    driver.find_element_by_css_selector("[href^='https://www.hao']")
    # href为https://www.hao开头的元素
    driver.find_element_by_css_selector("[href$='123.com']")
    # href为123.com结尾的元素
    driver.find_element_by_css_selector("[href*=hao123]")
    # href包含hao123的元素
    
  4. 组合式定位

    driver.find_element_by_css_selector("span > input[class='s_ipt'][name='wd']")
    # 查找任意span下Class名称为s_ipt,name属性为wd的input元素
    

通过By对象按动态条件查找(喜欢用这个)

导入by对象

from selenium.webdriver.common.by import by

格式

driver.find_element(By.查找条件, "条件值")

例子

from selenium import webdriver
from selenium.webdriver.common.by import By

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

driver.find_element(By.ID, "kw")
driver.find_element(By.NAME, "wd")
driver.find_element(By.CLASS_NAME, "s_ipt")
driver.find_element(By.LINK_TEXT, "地图")
driver.find_element(By.PARTIAL_LINK_TEXT, "地")
driver.find_element(By.TAG_NAME, "input")
driver.find_element(By.XPATH, "//input[@id='kw']")
driver.find_element(By.CSS_SELECTOR, "#kw")

查找元素集合

这里的elements有s噢

driver.find_elements_by_id("id属性值")
driver.find_elements_by_name("name属性值")
driver.find_elements_by_class_name("class属性值")
driver.find_elements_by_link_text("链接文本")
driver.find_elements_by_partial_link_text("链接的一部分文本")
driver.find_elements_by_tag_name("HTML标签名称")
driver.find_elements_by_xpath("XPath表达式")
driver.find_elements_by_css_selector("CSS选择器")
driver.find_elements(By.查找条件, "条件值")

例子

from selenium import webdriver
from selenium.webdriver.common.by import By

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

baiduLinks = driver.find_elements(By.CLASS_NAME, "mnav")
print("找到的链接数量:", len(baiduLinks))
print("链接文本如下:")
for link in baiduLinks:
    print(link.text)

结果

找到的链接数量: 9
链接文本如下:
新闻
hao123
地图
贴吧
视频
图片
网盘
文库
更多

Process finished with exit code 0

嵌套查找

baiduSearchForm = driver.find_element(By.ID, "form")
baiduSearchTextbox = baiduSearchForm.find_element(By.ID, "kw")

页面元素的基本操作

单击元素

webElement.click()

输入内容或者上传附件

webElement.send_keys("要输入的内容")

清空元素内容

webElement.clear()

提交表单元素

webElement.submit()

下拉框元素的选项操作

导入Select包

from selenium.webdriver.support.select import Select

选项文本、选项值、选项索引

Select(selectWebElement).select_by_visible_text("每页显示30条")
Select(selectWebElement).select_by_value("20")
Select(selectWebElement).select_by_index(0)

例子

from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get("https://tieba.baidu.com/f/search")  # 该地址已失效

selectWebElement = driver.find_element(By.NAME, "rn")
Select(selectWebElement).select_by_visible_text("每页显示30条")
time.sleep(3)

Select(selectWebElement).select_by_value("20")
time.sleep(3)

Select(selectWebElement).select_by_index(0)

获取页面元素的内容

获取元素基本属性

获取元素文本值

格式

webElement.text

例子

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")  # 该地址已失效

baiduMapLink = driver.find_element(By.PARTIAL_LINK_TEXT, "地")
print("文本值为:", baiduMapLink.text)
获取元素的标签类型
webElement.tag_name
获取选中状态
webElement.is_selected()
获取可编辑状态
webElement.is_enabled()
判断元素是否已显示
webElement.is_displayed()

获取HTML属性、DOM属性、CSS属性

HTML
webElement.get_attribute("属性名称")

例子

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")  # 该地址已失效

baiduSearchTextbox = driver.find_element(By.ID, "kw")
baiduSearchTextbox.send_keys("hello world")

print("获取已设定HTML属性")
print("id: ", baiduSearchTextbox.get_attribute("id"))
print("name: ", baiduSearchTextbox.get_attribute("name"))
print("class: ", baiduSearchTextbox.get_attribute("class"))
print("value: ", baiduSearchTextbox.get_attribute("value"))
print("maxlength: ", baiduSearchTextbox.get_attribute("maxlength"))
print("autocomplete: ", baiduSearchTextbox.get_attribute("autocomplete"))

print("获取未设定HTML属性")
print("style: ", baiduSearchTextbox.get_attribute("style"))
print("height: ", baiduSearchTextbox.get_attribute("height"))
print("draggable: ", baiduSearchTextbox.get_attribute("draggable"))

print("获取不存在的HTML属性")
print("tongering", baiduSearchTextbox.get_attribute("tongering"))

driver.quit()

结果

获取已设定HTML属性
id:  kw
name:  wd
class:  s_ipt
value:  hello world
maxlength:  255
autocomplete:  off
获取未设定HTML属性
style:  
height:  0
draggable:  false
获取不存在的HTML属性
tongering None

获取DOM元素

格式

webElement.get_property("属性名称")
  1. 标准HTML有效,对非标准属性无效

    标准属性即HTML自带属性,非标准属性即自命名属性

  2. HTML属性和DOM属性时实时同步的

    但是input.value是单向

    HTML---->DOM ✅

    DOM---->HTML❌

区别:HTML的get_attribute函数和get_property函数的区别

  1. get_attribute 不区分大小写

    get_property 区分大小写

  2. HTML映射到DOM 极少数名称可能不同,如:

    get_attribute("class")

    get_property ("className")

  3. HTML映射到DOM 极少数值可能不同,如:

    get_attribute 返回单个字符串,以;分隔

    get_property 返回字符串数组

  4. HTML设置为相对路径,href获得的结果也不一样,如:

    get_attribute 获得相对路径

    get_property 获得完整路径

获得元素的CSS属性

格式

webElement.value_of_css_property("CSS属性名称")

获取元素的位置与大小

格式

webElement.location  # 获取位置对象
webElement.size  # 获取大小对象
webElement.rect  # 获取位置和大小对象

获取下拉元素的选项

格式

from selenium.webdriver.support.select import Select

SelectWebElement.first_selected_option  # 获取首个已选中对象
SelectWebElement.all_selected_options  # 获取全部已选中对象
SelectWebElement.options  # 获取提供的所有选项

例子

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/f/search/adv")

selectWebElement = driver.find_element(By.NAME, "rn")
print("首个已选中项:", Select(selectWebElement).first_selected_option.text)

selectedOptions = ""
for selectedOption in Select(selectWebElement).all_selected_options:
    selectedOptions += selectedOption.text + ";"
print("全部已选中项:", selectedOptions)

supportedOptions = ""
for supportedOption in Select(selectWebElement).options:
    supportedOptions += supportedOption.text + ";"
print("提供的所有选项:", supportedOptions)

driver.quit()

处理浏览器弹出框

弹出框的确认与取消

Alert.accept()  # 单击确认按钮
Alert.dismiss()  # 单击取消按钮

实例

alert = driver.find_element(By.XPATH, "//input[@value='Alert']")
alert.click()
time.sleep(3)

driver.switch_to.alert.accept()

获取弹出框的文本

Alert.text

向弹出框输入内容

Alert.send_keys("要输入的内容")

多网页切换操作

多浏览器窗口的切换操作

driver.current_window_handle  # 获得WebDriver当前正在操作的浏览器窗口句柄
driver.window_handles  # 获得该WebDriver实例下的全部句柄
driver.switch_to.window(窗口句柄)  # 切换到指定窗口

例子

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

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

print("未操作前的全部窗口句柄:", driver.window_handles)
driver.find_element(By.LINK_TEXT, "登录").click()
time.sleep(3)
driver.find_element(By.LINK_TEXT, "立即注册").click()
time.sleep(3)
print("单击立即注册按钮后的全部窗口句柄:", driver.window_handles)
print("当前窗口句柄:", driver.current_window_handle)

driver.switch_to.window(driver.window_handles[1])
driver.find_element(By.NAME, "userName").send_keys("CustomUserName")
time.sleep(3)
print("切换到注册页后的当前窗口句柄:", driver.current_window_handle)

driver.switch_to.window(driver.window_handles[0])
time.sleep(3)
driver.find_element(By.CLASS_NAME, "close-btn").click()
print("切换回首页后的当前窗口句柄:", driver.current_window_handle)

输出结果

未操作前的全部窗口句柄: ['7D62F31317A753077CEEA96DF0B24086']
单击立即注册按钮后的全部窗口句柄: ['7D62F31317A753077CEEA96DF0B24086', 'F6EA3B671021699A27E885D5C9821D3B']
当前窗口句柄: 7D62F31317A753077CEEA96DF0B24086
切换到注册页后的当前窗口句柄: F6EA3B671021699A27E885D5C9821D3B
切换回首页后的当前窗口句柄: 7D62F31317A753077CEEA96DF0B24086

IFrame切换

在AJAX之前IFrame就很火,现在寥寥无几

现在一般使用IFrame用来引入一些空白界面,处理与其他网站之间的同步通信,例如跨域LocalStorage等操作。

driver.switch_to.frame(IFrame元素)  # 切换到当前页面(或IFrame)的下一级指定IFrame中
driver.switch_to.parent_frame()  # 切换到当前IFrame的上一级页面(或IFrame)中

结束WebDriver会话

driver.close():关闭WebDriver当前所在窗口

driver.quit():关闭所有相关窗口并结束会话

标签:Web,get,Selenium,元素,driver,element,获取,Driver,find
From: https://www.cnblogs.com/tongering/p/18013411

相关文章

  • 08-selenium
    1.selenium自动化selenium可以操作浏览器,在浏览器页面上实现:点击、输入、滑动等操作。不同于selenium自动化,逆向本质是:分析请求,例如:请求方法、请求参数、加密方式等。用代码模拟请求去实现同等功能。逆向vs自动化SeleniumSelenium,【优】简单不需要逆向,只需要控制浏览......
  • 10.使用RestSharps请求WebAPI
    1.请求类publicclassBaseRequest{///<summary>///请求法式///</summary>publicRestSharp.MethodMethod{get;set;}///<summary>///路由///</summary>publicstr......
  • extism 基于rust 开发的强大webassembly 框架
    extism基于rust开发的强大webassembly框架包含的特性使用简单 可以方便的开发基于webassembly的插件系统安全方便运行 包含了灵活的架构可以可以方便与多种语言进行通信(基本覆盖了主流的编程语言)说明目前基于webassembly的语言集成热度是越来越高了,webassembly很值......
  • SharePoint Online Framework WebPart 魔改乱用
    前言最近,经常碰到微软更新SharePointOnlineDOM的情况,然后,页面里的WebPart就乱七八糟了,思前想后,找了个解决方法可以规避这个问题,虽然有点剑走偏锋,但是大家可以看看。正文1.下面灰色的部分,是我测试用的WebPart,大家可以看到位置比较奇葩,在整个页面最下方,而不是......
  • 打包部署运行web项目:No artifacts marked for deployment
     早期的web项目是没有内置tomcat或者jetty服务器的。不像springboot内置了tomcat服务器,所以可以直接运行。早期的web项目还没有使用springboot框架,故没有内置的服务器,故需要手动拷贝到tomcat/jetty服务器下才能运行。参考:IDEA中运行Tomcat的时候报出:Noartifactsmarkedfor......
  • Asp-Net-Core学习笔记:WebApi开发实践
    前言用AspNetCore做Api开发也有一段时间了,正好年底在做总结,做一个WebApi开发实践笔记。暂时想到的一些技术关键词,同时也作为本文的大纲,现在对这套技术体系的了解还不够深入,以后会持续更新这个Api开发实践~身份认证:JwtBearer分页:X.PagedList缓存ResponseCacheRedis:St......
  • [Blazor WebAssembly] 学习随笔——身份验证
    最近在折腾微信相关的开发,包括公众号、企业微信内部应用、企业微信第三方开发。基于Razor方式写了:企业微信内部应用的类库企业微信第三方应用的类库公众号的类库一个统一管理公众号、企业微信内部应用和第三方应用有关授权、Token之类的应用。然后准备写一个开源的简单的酒......
  • Asp .Net Core 系列:Asp .Net Core 集成 Panda.DynamicWebApi
    目录简介Asp.NetCore集成Panda.DynamicWebApi配置原理什么是POCOController?POCO控制器原理ControllerFeatureProvider实现自定义判断规则IApplicationModelConventionPanda.DynamicWebApi中的实现ConfigureApiExplorer()ConfigureSelector()ConfigureParameters()简介Panda......
  • net8 webapi
    直接用net8webapi模板,创建时不要选控制器,直接添加类文件,并调整基类等即可usingMicrosoft.AspNetCore.Mvc;usingNewtonsoft.Json.Converters;usingNewtonsoft.Json.Linq;usingSystem.Text.Unicode;namespaceWebApplication1.Controllers{[ApiController][......
  • 软件测试学习笔记丨Web端测试——测试用例设计思路
    一、UI测试界面风格统一,与UI设计原型图一致界面文案正确提示、警告或错误说明描述准确切换窗口大小,将窗口缩小后,页面是否按比例缩小或出现滚动条,页面是否正确显示所有的图片是否都被正确装载在不同的浏览器、分辨率下图片是否能正确显示二、搜索测试如果支持模糊查询,搜索名称中......