Selenium Web Driver的基本运用

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():关闭所有相关窗口并结束会话

posted @   tongering  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示