快速学习selenium基础操作

 全篇大概19000字(含代码),建议阅读时间1h


什么是Selenium?

Selenium是一系列自动化工具集的统称,官方工具有 Selenium IDE、Selenium WebDriver、Selenium Grid, 主要用于桌面端Web应用程序的自动化。能够通过多种方式定位界面元素、操作元素并获取元素的各项信息。

自动化测试四个象限

  1. 面向技术和指导开发:集成测试、组件测试、单元测试。(完全自动化)
  2. 面向业务和指导开发:功能测试、原型测试。(部分自动化)
  3. 面向业务和评估产品:探索式测试、用户演示、可用性测试(手工测试)
  4. 面向技术和评估产品:性能测试、安全性测试、可靠性测试、各种非功能性测试。(能否自动化取决于场景)

工具集

  1. Selenium IDE 用于在浏览器中进行录制与回放测试的操作。(开箱即用、易于调试、跨浏览器)
  2. Selenium WebDriver 在本地或远程计算机上以原生方式驱动浏览器。(简洁明快、支持全部主流浏览器、W3C标准)
  3. Selenium Grid 支持多台机器同时运行多个基于WebDriver 测试,减少在多浏览器和多操作系统上测试耗费时间。(支持多浏览器、多版本及多操作系统、大幅缩短执行时间)
  4. Appium 用于移动设备原生App 及 Web应用程序的自动化测试。

一、Selenium WebDriver

WebDriver、驱动程序、浏览器之间的关系

二、安装selenium库

通过使用pip进行安装selenium库。

pip install selenium

测试代码 

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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")         # 打开百度页面
driver.find_element(By.ID, "kw").click()    # 单击搜索文本框
driver.find_element(By.ID, "kw").send_keys("hello world")   # 输入 hello world
driver.find_element(By.ID, "su").click()    # 单击百度一下按钮
driver.quit()   # 关闭浏览器

三、浏览器基础操作

3.1 依次打开浏览器

from selenium import webdriver

chrome = webdriver.Chrome()     # 打开Chrome
firefox = webdriver.Firefox()   # 打开Firefox
edge = webdriver.Edge()         # 打开Edge
ie = webdriver.Ie()             # 打开IE
opera = webdriver.Opera()       # 打开Opera

3.2 浏览器导航操作

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
3.3 浏览器3种操作

1. back() 后退

2. forward() 前进

3. refresh() 刷新

四、浏览器窗口操作

4.1 窗口基础操作

1. minimize_window() 最小化窗口

2. maximize_window() 最大化窗口

3. close() 关闭窗口

4. set_window_position(坐标x, 坐标y) 将浏览器窗口移动到指定位置

5. set_window_size(宽度像素, 高度像素) 将浏览器窗口设置为指定大小

6. set_window_rect(坐标x, 坐标y, 宽度像素, 高度像素) 将浏览器窗口移动到指定位置,并设置窗口大小

测试代码

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.set_window_position(0, 0)    # 移动到屏幕左上角
time.sleep(3)   # 休眠3s
driver.set_window_size(500, 300)    # 设置窗口大小500*300
time.sleep(3)   # 休眠3s
driver.set_window_rect(100, 200, 600, 400)  
# 移动到屏幕左侧 100像素,屏幕上200像素,设置600*400

4.2 获取浏览器信息

1. title 获取浏览器窗口当前的标题

2. current_url 获取浏览器窗口当前的网址

测试代码

from selenium import webdriver

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

print("浏览器标题:", driver.title)
print("浏览器网址:", driver.current_url)

1. get_window_position() 获取位置对象

2. get_window_position()["x"] 获取X轴坐标值

3. get_window_position()["y"] 获取Y轴坐标值

4. get_window_size() 获取大小对象

5. get_window_size()["width"] 获取宽度值

6. get_window_size()["height"] 获取高度值

7. get_window_rect() 获取位置及大小对象

8. get_window_rect()["x"] 获取x坐标值

9. get_window_rect()["y"] 获取y坐标值

10. get_window_rect()["width"] 获取宽度值

11. get_window_rect()["height"] 获取高度值

测试代码

from selenium import webdriver

driver = webdriver.Chrome()

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

print("获取大小对象: ", driver.get_window_size())
print("获取宽度值: ", driver.get_window_size()["width"])
print("获取高度值: ", driver.get_window_size()["height"])

print("获取位置及大小对象: ", driver.get_window_rect())
print("获取位置坐标x值: ", driver.get_window_rect()["x"])
print("获取位置坐标y值: ", driver.get_window_rect()["y"])
print("获取宽度值: ", driver.get_window_rect()["width"])
print("获取高度值: ", driver.get_window_rect()["height"])

五、查找页面元素

5.1 通过By对象进行动态查找

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

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

  • By.ID
  • By.NAME
  • By.CLASS_NAME
  • By.LINK_TEXT
  • By.PARTIAL_LINK_TEXT
  • By.TAG_NAME
  • By.XPATH
  • By.CSS_SELECTOR

5.2 按id属性查找

find_element(By.ID, "id属性值") 根据id属性查找元素

测试代码

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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
searchTextBox = driver.find_element(By.ID, "kw")    # 根据ID查找元素
searchTextBox.send_keys("找到文本框")    # 在文本框中输入 "找到文本框"

5.3 按name属性查找

find_element(By.NAME, "name属性值")

测试代码

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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
searchTextBox = driver.find_element(By.NAME, "wd")
searchTextBox.send_keys("找到文本框")

5.4 按链接文本查找

find_element(By.LINK_TEXT, "链接文本")

测试代码

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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
link = driver.find_element(By.LINK_TEXT, "贴吧")
link.click()

5.5 按链接文本进行模糊查找

find_element(By.PARTIAL_LINK_TEXT, "贴")

测试代码

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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
link = driver.find_element(By.PARTIAL_LINK_TEXT, "贴")
link.click()

5.6 按标签类型查找

find_element(By.TAG_NAME)

测试代码

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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
inputText = driver.find_element(By.TAG_NAME, "input")   # 查找首个 input 标签
link = driver.find_element(By.TAG_NAME, "a")       # 查找首个 a 标签
spanText = driver.find_element(By.TAG_NAME, "span")    # 超找首个 span 标签

print(inputText)
print(link)
print(spanText)

5.7 按XPath查找

find_element(By.XPATH, "表达式")

5.8 基于绝对路径或相对路径

1. / 绝对路径

2. // 相对路径

测试代码

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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
inputText = driver.find_element(By.XPATH, "/html/body/div/div/div/div/div/form/span/input")   # 查找首个 input 标签
link = driver.find_element(By.XPATH, "a")       # 查找首个 a 标签
spanText = driver.find_element(By.XPATH, "span")    # 超找首个 span 标签

print(inputText)
print(link)
print(spanText)

5.9 基于索引或属性定位

[]使用中括号填入索引

测试代码

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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
inputText = driver.find_element(By.XPATH, "//span/input[1]")   # 选择第一个匹配表达式的元素
inputLastText = driver.find_element(By.XPATH, "//span/input[last()]")   # 选择最后一个与表达式匹配的元素
inputText_1 = driver.find_element(By.XPATH, "//input[@id='kw']")        # 按ID查询元素
inputText_2 = driver.find_element(By.XPATH, "//input[@name='wd']")      # 按name查询元素
inputText_3 = driver.find_element(By.XPATH, "//input[@class='s_ipt']")  # 按class查询元素

print(inputText)
print(inputLastText)
print(inputText_1)
print(inputText_2)
print(inputText_2)

5.10 基于轴定位

1. xpath支持从下层向上层查找元素,还可以向前或向后查找元素。

2. following 查找之后的元素

3. preceding 查找之前的元素

4. parent 查找父级元素

测试代码

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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
inputText_1 = driver.find_element(By.XPATH, "//span[@class='soutu-btn']/following::input[1]")   # 选择之后的首个input
inputText_2 = driver.find_element(By.XPATH, "//a[@id='quickdelete']/preceding::input[1]")   # 选择之前的首个input
inputText_3 = driver.find_element(By.XPATH, "//input[@id='su']/parent::span/parent::form//input[@id='kw']") # 选择父级元素的父级元素的input

print(inputText_1)
print(inputText_2)
print(inputText_2)

5.11 基于函数或表达式定位

1. text()

2. contains(属性, 文本内容) 包含

3. starts-width(属性, 文本) 以..开始的元素

4. and 两个条件同时符合

5. or 只符合一个条件

测试代码

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

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

driver.find_element(By.XPATH, "//a[text()='hao123']")   # 查找文本为hao123的
driver.find_element(By.XPATH, "//a[contains(@href, 'www.hao123.com')]")     # 查找包含文本www.hao123.com的a元素
driver.find_element(By.XPATH, "//a[contains(text(), 'ao12')]")  # 查找文本包含ao12的a元素
driver.find_element(By.XPATH, "//a[starts-width(@href, 'https://www.hao')]")    # 查找href属性以https://www.hao开头的a元素
driver.find_element(By.XPATH, "//a[@name='errorname' or text()='hao123']")  # 查找符合其中一个条件的a元素
driver.find_element(By.XPATH, "//a[contains(@href, 'hao123') and text()='hao123']")
# 查找属性包含hao123并且文本等于hao123的元素

5.12 按css选择器查找

find_element(By.CSS_SELECTOR, 选择器逻辑)

测试代码

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

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

inputText_1 = driver.find_element(By.CSS_SELECTOR, "html > body >  div > div > div > div > div > form > span > input")
inputText_2 = driver.find_element(By.CSS_SELECTOR, "span > input")

print(inputText_1)
print(inputText_2)

5.13 关键属性定位

id、class、name

测试代码

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

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

inputText_1 = driver.find_element(By.CSS_SELECTOR, "#kw")   # 匹配id属性
inputText_2 = driver.find_element(By.CSS_SELECTOR, ".s_ipt")    # 匹配class属性
inputText_3 = driver.find_element(By.CSS_SELECTOR, "[name=wd]")  # 匹配name属性

print(inputText_1)
print(inputText_2)
print(inputText_3)

5.14 属性进行模糊定位

1. ^ 开头

2. $ 结尾

3. *包含

测试代码

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

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

inputText_1 = driver.find_element(By.CSS_SELECTOR, "[href^='https://www.hao']")   # 查找href属性值以https://www.hao开头元素
inputText_2 = driver.find_element(By.CSS_SELECTOR, "[href$='baidu.com']")    # 查找href属性值以123.com结尾元素
inputText_3 = driver.find_element(By.CSS_SELECTOR, "[href*=hao123]")  # 查找href属性值包含123的元素

print(inputText_1)
print(inputText_2)
print(inputText_3)

5.16 组合式定位

将以上定位组合到一起

测试代码

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

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

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

print(inputText)

5.17 查找元素集合

同时去查找多个匹配元素。

find_elements(By.查找条件, "条件值")

测试代码

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

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

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

5.18 嵌套查找

通过查找已有元素之下符合条件的子元素。

测试代码

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

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

searchForm = driver.find_element(By.ID, "form")	# 查找ID为form的元素
searchTextBox = driver.find_element(By.ID, "kw") # 查找form中ID为kw的元素
print(searchTextBox)

六、页面元素基本操作

6.1 单击元素

webElement.click() 单击操作

测试代码 

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

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

driver.find_element(By.XPATH, "//span[text()='设置']").click()
driver.find_element(By.LINK_TEXT, "搜索设置").click()
time.sleep(3)

driver.find_element(By.ID, "s1_2").click()
driver.find_element(By.XPATH, "//li[text()='高级搜索']").click()
driver.find_element(By.XPATH, "//span[@title='关闭']").click()

driver.quit()

6.2 向元素输入内容或上传附件

send_keys("输入内容")

上传附件可以直接把文件路径填写进入就可以。

测试代码

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

driver = webdriver.Chrome()
driver.get('http://image.baidu.com/search/index?tn=baiduimage&word=selenium')
driver.find_element(By.ID, "stfile").send_keys("图片地址")
driver.quit()

6.3 清空元素内容

clear() 清空元素内容

例如搜索框,输入关键字后,然后清空文本框内容,在输入关键字,清空就可以使用claer()

测试代码

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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
searchTextBox = driver.find_element(By.ID, "kw")
searchTextBox.send_keys("小那同学")
searchTextBox.clear()   # 清空文本
searchTextBox.send_keys("小李同学")
time.sleep(3)
driver.quit()

6.4 提交表单元素

submit() 提交

搜索功能不需要点击搜索按钮,直接通过submit() 函数就可以提交。

测试代码

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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
searchTextBox = driver.find_element(By.ID, "kw")
searchTextBox.send_keys("python")
driver.find_element(By.ID, "form").submit()     # 提交表单
time.sleep(3)
driver.quit()

6.5 下拉框元素选项操作

对于下拉框元素,需要将WebElement对象转换成Select对象才可以进行操作。

1. from selenium.webdriver.support.select import Select 引入Select模块

2. select_by_visible_text("选项文本") 根据文本选择

3. select_by_value("选项值") 根据选项值选择

4. select_by_index(选项索引) 根据选项索引选择,从0开始

稍后补充

七、页面元素的内容

7.1 获取元素的基本属性

7.1.1 获取元素的文本值

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)
driver.quit()
7.1.2 获取元素的标签类型

tag_name 标签类型

测试代码

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.tag_name)
driver.quit()
7.1.3 获取元素的选中状态

is_selected() 是否选中状态, True 选中、False 未选中

测试代码

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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element(By.XPATH, "//span[text()='设置']").click()
driver.find_element(By.LINK_TEXT, "搜索设置").click()
time.sleep(3)
print(driver.find_element(By.ID, "s1_1").is_selected())
print(driver.find_element(By.ID, "s1_2").is_selected())
driver.quit()
7.1.4 判断元素可编辑状态

is_enabled() 可编辑状态, True 可编辑, False 不可编辑

测试代码

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")
print(baiduSearchTextbox.is_enabled())
driver.quit()
7.1.5 判断元素是否已显示

is_displayed() 是否已显示, True 已显示, False 未显示

测试代码

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

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

driver.find_element(By.XPATH, "//span[text()='设置']").click()
time.sleep(3)
advSearchOption = driver.find_element(By.LINK_TEXT, "高级搜索")
print(advSearchOption.is_displayed())

driver.find_element(By.ID, "kw").click()
time.sleep(3)
print(advSearchOption.is_displayed())
driver.quit()

7.2 获取HTML、DOM、CSS属性

7.2.1 获取元素HTML属性

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

测试代码

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("selenium")

print("获取已设定的属性")
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("获取未设定的属性,默认值")
print("style = ", baiduSearchTextbox.get_attribute("type"))
print("height = ", baiduSearchTextbox.get_attribute("height"))
print("draggable = ", baiduSearchTextbox.get_attribute("draggable"))

print("获取不存在属性")
print("不存在 = ", baiduSearchTextbox.get_attribute("abcdefghijklmn"))
driver.quit()
7.2.2 获取元素DOM属性

get_propperty("属性名称") 获取DOM属性,区分大小写。

测试代码

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")

print("获取DOM属性")
print("节点HTML源码 = ", baiduSearchTextbox.get_property("outerHTML"))
print("节点名称 = ", baiduSearchTextbox.get_property("nodeName"))
print("节点类型 = ", baiduSearchTextbox.get_property("nodeType"))
print("节点实际高度 = ", baiduSearchTextbox.get_property("clientHeight"))
print("节点实际宽度 = ", baiduSearchTextbox.get_property("clientWidth"))
print("该节点的父节点的节点名称 = ", baiduSearchTextbox.get_property("parentNode").get_property("nodeName"))
print("紧邻该节点的下一个节点源码", baiduSearchTextbox.get_property("nextSibling").get_property("outerHTML"))

print("获取不存在的DOM属性")
print("不存在的 = ", baiduSearchTextbox.get_property("abcdefg"))

driver.quit()
7.2.3 获取元素CSS属性

value_of_css_property("css属性名称") 获取元素CSS属性

测试代码

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")

print("宽度样式值 = ", baiduSearchTextbox.value_of_css_property("width"))
print("高度样式值 = ", baiduSearchTextbox.value_of_css_property("height"))
print("外边距值 = ", baiduSearchTextbox.value_of_css_property("margin"))
print("文字颜色 = ", baiduSearchTextbox.value_of_css_property("color"))
print("背景颜色 = ", baiduSearchTextbox.value_of_css_property("background"))
driver.quit()
7.2.4 获取元素位置与大小

1. location 获取位置对象

2. size 获取大小对象

3. rect 获取位置及大小对象

测试代码

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")

print("获取位置对象 = ", baiduSearchTextbox.location)
print("获取位置坐标 x 值 = ", baiduSearchTextbox.location["x"])
print("获取位置坐标 y 值 = ", baiduSearchTextbox.location["y"])

print("获取大小对象 = ", baiduSearchTextbox.size)
print("获取宽度值 = ", baiduSearchTextbox.size["width"])
print("获取高度值 = ", baiduSearchTextbox.size["height"])

print("获取位置及大小对象 = ", baiduSearchTextbox.rect)
print("获取位置坐标 x 值 = ", baiduSearchTextbox.rect["x"])
print("获取位置坐标 y 值", baiduSearchTextbox.rect["y"])
print("获取宽度值 = ", baiduSearchTextbox.rect["width"])
print("获取高度值 = ", baiduSearchTextbox.rect["height"])

driver.quit()
7.2.5 获取下拉框元素的选项

1. first_selected_option 首个已选中项

2. all_selected_options 获取全部已选中项

3. options 下拉框提供所有选项

测试代码

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

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)

八、处理浏览器弹出框

浏览器弹出框分为3种,Alert、Confirmation、Prompt。

在WebDriver中视为Alert对象。

driver.switch_to.alert 获取Alert对象

8.1 弹出框的确认和取消

1. Alert.accept() 单击确认按钮

2. Alert.dismiss() 单击取消按钮

测试代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>弹出框</title>
</head>
<body>
    <input type="button" onclick="alert('alert');" value="Alert">
    <input type="button" onclick="confirm('confirm');" value="confirm"/>
    <input type="button" onclick="prompt('prompt','');" value="prompt"/>
</body>
</html>
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get("网页位置")

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

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

8.2 获取弹出框文本

Alert.text

测试代码

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

driver = webdriver.Chrome()
driver.get("")

alert = driver.find_element(By.XPATH, "//input[@value='alert']")
alert.click()
print("弹出框文本 = ", driver.switch_to.alert.text)
driver.switch_to.alert.accept()

confirm = driver.find_element(By.XPATH, "//input[@value='confirm']")
confirm.click()
print("弹出框文本 = ", driver.switch_to.alert.text)
driver.switch_to.alert.accept()

prompt = driver.find_element(By.XPATH, "//input[@value='prompt']")
prompt.click()
print("弹出框文本 = ", driver.switch_to.alert.text)
driver.switch_to.alert.accept()
driver.quit()

8.3 向弹出框输入内容

Alert.send_keys("输入内容")

测试代码

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

driver = webdriver.Chrome()
driver.get("")

prompt = driver.find_element(By.XPATH, "//input[@value='prompt']")
prompt.click()
time.sleep(3)
driver.switch_to.alert.send_keys("小那同学")
driver.quit()

九、多网页切换

操作网页会打开新的窗口,有可能遇到将一个网页内容嵌入到另一个网页,就需要打开多个页面。

9.1 多浏览器窗口切换

多浏览器柴沟切换依赖于窗口句柄,一个WebDriver实例只会打开一个窗口句柄,但单击链接,会在新窗口显示网页,这时就拥有两个句柄。

1. current_window_handle 获得当前正在操作的窗口句柄

2. window_handles 获得WebDriver下全部句柄

3. 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("小那同学")
time.sleep(3)
print("切换到注册页后的当前窗口句柄 = ", driver.current_window_handle)

driver.switch_to.window(driver.window_handles[0])
time.sleep(3)
driver.quit()

9.2 Iframe 切换

1. switch_to.frame(IFrame元素) 切换当前页面下一级指定IFrame中

2. switch_to.parent_frame() 切换当前IFrame的上一级页面中

测试代码

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

driver = webdriver.Chrome()
driver.get("")
driver.find_element(By.ID, "siteUrl").send_keys("https://www.baidu.com")
driver.find_element(By.TAG_NAME, "button").click()
time.sleep(3)

driver.switch_to.frame(driver.find_element(By.ID, "innerFrame"))
driver.find_element(By.ID, "kw").send_keys("selenium")
time.sleep(3)

driver.switch_to.parent_frame()
driver.find_element(By.ID, "siteUrl").clear()
driver.find_element(By.ID, "siteUrl").send_keys("https://www.baidu.com")
driver.find_element(By.TAG_NAME, "button").click()
driver.quit()

十、结束WebDriver

quit() 关闭所有窗口并结束WebDriver

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/935024.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

说下JVM中一次完整的GC流程?

大家好&#xff0c;我是锋哥。今天分享关于【说下JVM中一次完整的GC流程&#xff1f;】面试题。希望对大家有帮助&#xff1b; 说下JVM中一次完整的GC流程&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在JVM中&#xff0c;垃圾回收&#xff08;GC&am…

Vue.createApp的对象参数

目录 template 属性 data 属性 methods 属性 疑问 function 函数的两种写法 methods 属性中 this 的指向 总结 Vue 实例是通过 Vue.createApp() 创建的&#xff0c;该函数需要接收一个对象作为参数&#xff0c;该对象可添加 template、data、methods 等属性。 template …

前端H5移动端基础框架模板 :Vue3 + Vite5 + Pinia + Vant4 + Sass + 附源码

技术栈选用 Vue3 Vite5 Pinia Vant4 Sass 源码地址&#xff1a; git clone https://gitee.com/gaiya001/h5-APP.git1. 1.vite.config.js文件配置 ** import { defineConfig } from vite // 导入 Vite 的配置函数 import vue from vitejs/plugin-vue // 导入 Vue 插件 i…

LabVIEW动态加载语言与VI调用 附件有程序

此LabVIEW设计通过动态加载语言资源和调用VI来实现多语言支持和模块化功能。它适用于需要灵活语言切换和动态VI管理的场景&#xff0c;但在开发和维护中有一些需要优化的地方。以下是详细的分析和改进建议。 优点&#xff1a; 灵活的语言切换&#xff1a; 用户可通过加载不同语…

分布式搜索引擎之elasticsearch基本使用2

分布式搜索引擎之elasticsearch基本使用2 在分布式搜索引擎之elasticsearch基本使用1中&#xff0c;我们已经导入了大量数据到elasticsearch中&#xff0c;实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以j接下来&#xff0c;我们研究下…

使用webrtc-streamer查看实时监控

摄像头配置&#xff08;海康摄像头为例&#xff09; 摄像头视频编码应改成H264格式 webrtc-streamer下载 webrtc-streamer下载地址 下载后解压出来双击运行&#xff0c;端口默认8000 VUE2项目引入文件 在项目静态文件“public”中需引入两个js文件“webrtcstreamer.js”与“…

鸿蒙调试打包(非正式打包)

文章目录 前言第一步&#xff1a;生成.p12和.csr文件第二步&#xff1a;申请证书的前置步骤第三步&#xff1a;申请证书 前言 HarmonyOS 应用打包后的文件为.app 格式&#xff0c; android 打包后的文件为.apk&#xff0c;IOS 打包后的文件为.apa HarmonyOS通过数字证书&#…

如何利用DBeaver配置连接MongoDB和人大金仓数据库

最近根据国产化要求&#xff0c;需要使用国产数据库&#xff0c;但习惯使用DBeaver连接各种成熟的商业或开源数据库。因此&#xff0c;就想着如何继续基于该工具&#xff0c;连接MongoDB和人大金仓数据库&#xff0c;查了半天很多地方说法不统一&#xff0c;所以自己就简单整理…

手机租赁系统开发指南一站式服务流程解析

内容概要 手机租赁系统的开发是一个复杂但有趣的过程&#xff0c;像搭建乐高一样&#xff0c;只要找到合适的模块&#xff0c;就能打造出一个宾至如归的租赁平台。在这部分&#xff0c;我们将对开发流程的整体结构进行简要概述&#xff0c;并指出每个环节的重要性。 首先&…

Linux中vi和vim的区别详解

文章目录 Linux中vi和vim的区别详解一、引言二、vi和vim的起源与发展三、功能和特性1、语法高亮2、显示行号3、编辑模式4、可视化界面5、功能扩展6、插件支持 四、使用示例1、启动编辑器2、基本操作 五、总结 Linux中vi和vim的区别详解 一、引言 在Linux系统中&#xff0c;vi和…

信息安全管理——应急响应、灾备与恢复

安全管理 信息安全管理 信息安全管理是指通过维护信息的机密性、完整性和可用性来管理和保护信息资产&#xff0c;是对信息安全保障进行指导、规范和管理的一系列活 动和过程。 信息安全管理的意义在于他是组织或者公司管理体系的一个重要环节 &#xff0c;比如说一所大学就是…

数据库数据恢复—ORACLE常见故障有哪些?如何恢复数据?

Oracle数据库常见故障表现&#xff1a; 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。 Oracle数据库数据恢复方案&#xff1a; 1、检测存放数据库的服务器/存储设备是否存…

使用 WebStorm 导入已有的 Vue 项目并运行的步骤与注意事项

目录 1. 引言2. WebStorm 环境准备 2.1 安装 WebStorm2.2 配置 Node.js 和 npm2.3 使用 nvm 管理 Node.js 和 npm 版本2.4 npm 版本与 Vue 版本对应关系 3. 导入已有的 Vue 项目 3.1 打开 Vue 项目3.2 安装项目依赖3.3 使用 nvm 控制 Node.js 和 npm 版本 4. 运行 Vue 项目 4.…

C++感受15-Hello Object 封装版 -下(上机)

一步步&#xff08;分解成九段小视频&#xff09;带你完成“选美大赛海选报名程序”&#xff0c;从需求到设计再到实现&#xff0c;完整体验&#xff0c;同时边学边用以下知识点&#xff1a; 转换构造、复制构造、转发构造特定成员函数默认实现成员数据初始化列表成员数据默认值…

深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解

目录 深入理解 JavaScript 中的 Array.find() 方法&#xff1a;原理、性能优势与实用案例详解 一、引言&#xff1a;为什么要使用Array.find() 二、Array.find()的使用与技巧 1、基础语法 2、返回值 3、使用技巧 三、Array.find()的优势与实际应用案例 1、利用返回引用…

探索 LeNet-5:卷积神经网络的先驱与手写数字识别传奇

一、引言 在当今深度学习技术蓬勃发展的时代&#xff0c;各种复杂而强大的神经网络架构不断涌现&#xff0c;如 ResNet、VGG、Transformer 等&#xff0c;它们在图像识别、自然语言处理、语音识别等众多领域都取得了令人瞩目的成果。然而&#xff0c;当我们回顾深度学习的发展历…

希迪智驾持续亏损8.2亿:毛利率下滑,冲刺“自动驾驶矿卡第一股”

《港湾商业观察》黄懿 近日&#xff0c;希迪智驾&#xff08;湖南&#xff09;股份有限公司&#xff08;下称“希迪智驾”&#xff09;向港交所主板递交上市申请&#xff0c;联席保荐人为中金公司、中信建投国际、中国平安资本&#xff08;香港&#xff09;。 资料显示&#…

Vue 提供了Transition,可以帮助你制作基于状态变化的过渡和动画

官方文档&#xff1a;https://cn.vuejs.org/guide/built-ins/transition.html Transition​ Vue 提供了两个内置组件&#xff0c;可以帮助你制作基于状态变化的过渡和动画&#xff1a; <Transition> 会在一个元素或组件进入和离开 DOM 时应用动画。本章节会介绍如何使用…

Ansible自动化运维(三)playbook剧本详解

Ansible自动化运维这部分我将会分为五个部分来为大家讲解 &#xff08;一&#xff09;介绍、无密钥登录、安装部署、设置主机清单 &#xff08;二&#xff09;Ansible 中的 ad-hoc 模式 模块详解&#xff08;15&#xff09;个 &#xff08;三&#xff09;Playbook 模式详解 …

【汽车】-- 燃油发动机3缸和4缸

3缸和4缸燃油发动机是小轿车常见的发动机配置。以下从结构特点、性能、经济性等方面对两者进行对比&#xff0c;并分析优缺点及使用注意事项&#xff1a; 1. 结构与运行原理 3缸发动机 特点&#xff1a;少一个气缸&#xff0c;内部零部件更少&#xff0c;整体结构更紧凑。优点…