【第四天】零基础入门刷题Python-Selenium-自动化测试-打开百度的首页搜索B站然后打开B站-切换B站窗口在B站搜索框中搜索Selenium-复习XPATH详细语法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、先复习昨天的XPATH语法,然后学习怎么切换窗口
  • 二、详细代码
    • 1.对本节代码XPath表达式的解释
    • 2.在百度的首页上搜索B站后打开B站-在B站搜索框中搜索Selenium
    • 3.对切换窗口的详细介绍
    • 4.对上方的两个模块的详细介绍
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

第零天练习补充零基础入门刷题Python-Selenium-自动化测试-搭建WebDriver驱动-以及下载驱动的地址
第一天练习打开Firefox浏览器实例和打开Chrome浏览器实例-进入百度的首页
第二天练习用Chrome浏览器实例-在百度的首页上搜索B站
第三天练习用Chrome浏览器实例-在百度的首页上搜索B站-利用XPATH打开B站-注意:(从现在开始以后零基础入门刷题Python-Selenium-自动化测试都会用XPATH的方法来使用
第四天练习用Chrome浏览器实例-在百度的首页上搜索B站后打开B站-在B站搜索框中搜索Selenium


提示:以下是本篇文章正文内容,下面案例可供参考

一、先复习昨天的XPATH语法,然后学习怎么切换窗口

XPATH详细语法:
一、基本路径表达式:
/ 表示从根节点开始选择元素,是绝对路径的起始。例如,/html/body/div 表示从 HTML 文档的根节点(html)开始,选择 body下的div元素。
// 表示在整个文档中查找元素,不考虑其位置,是相对路径。
二、节点选择:
* 匹配任何元素节点。例如,//* 会匹配文档中的所有元素节点。
element 根据元素名称选择节点。例如,//p 会查找所有的 p元素。
三、根据属性选择节点:
[@attribute=‘value’] 根据元素的属性及其值选择节点。例如,//input[@type=‘text’] 会查找所有 type 属性值为 text 的 input元素。
[@attribute] 选择具有指定属性的节点,不考虑属性值。例如,//div[@class] 会查找所有具有 class 属性的 div元素。
四、根据位置选择节点:
[position()] 根据元素的位置选择节点。例如,//li[position()=2] 会选择文档中的第二个 li 元素。
[last()] 选择最后一个元素。例如,//li[last()] 会选择最后一个 li 元素。
[position()< 3] 选择最后一个元素。例如,//li[last()] 会选择最后一个 li 元素。
五、 轴(Axes):
child:: 选择当前节点的子节点。例如,child::div 会选择当前节点的所有 div 子节点。
descendant:: 选择当前节点的后代节点(包括子节点、孙节点等)。例如,descendant::p 会选择当前节点的所有 p 后代节点。
ancestor:: 选择当前节点的祖先节点。例如,ancestor::div 会选择当前节点的所有 div 祖先节点。
following-sibling:: 选择当前节点之后的兄弟节点。例如,following-sibling::p 会选择当前节点后面的所有 p 兄弟节点。
preceding-sibling:: 选择当前节点之前的兄弟节点。例如,preceding-sibling::p 会选择当前节点前面的所有 p 兄弟节点。
六、文本选择:
text() 选择元素的文本内容。例如,//p/text() 会选择所有 p 元素的文本内容。
七、组合选择:
I(竖线) 可用于组合多个路径表达式。例如,//div[@class=‘header’] I(竖线) //div[@class=‘footer’] 会选择 class 属性为 header 的 div 元素和 class 属性为 footer 的 div 元素。
八、函数使用:
contains() 用于检查元素的属性是否包含指定的字符串。例如,//div[contains(@class,‘container’)] 会查找 class 属性中包含 container 的 div 元素。
starts-with() 检查元素的属性是否以指定字符串开始。例如,//div[starts-with(@id,‘section’)] 会查找 id 属性以 section 开始的 div 元素。

from selenium.webdriver.support import expected_conditions as EC:

  • selenium.webdriver.support 是 Selenium 库中的一个模块,提供了各种支持自动化测试的工具和类。
  • expected_conditions是该模块中的一个子模块,包含了一系列预定义的条件,这
    些条件用于在自动化测试中检查元素或页面是否达到了预期的状态。
  • as EC 是Python 的别名语法,将 expected_conditions 简称为 EC,方便在代码中使用,使代码更加简洁。

from selenium.webdriver.support.wait import WebDriverWait:

  • selenium.webdriver.support.wait 是 Selenium 库中的一个模块,包含 WebDriverWait
    类,用于实现智能等待功能。

!!!上面两个模块在本节代码的使用介绍在本文的代码末尾处详细解释!!!

二、详细代码

1.对本节代码XPath表达式的解释

  1. 通过XPATH定位属性id的方法在百度的首页上搜索B站(示例):
对XPath表达式 '//div[@id="content_left"]//a[contains(text(), "哔哩哔哩")]' 的详细解释:
1.//:
	这对双斜杠表示选择文档中的节点时,不考虑它们位于当前节点(在XPath的上下文中,这通常是从根节点或某个指定的起始节点开始)的什么层级。换句话说,它会搜索整个文档树,查找匹配的节点,而不仅仅是直接子节点。
2.div[@id="content_left"]:
	这部分指定了要查找的div元素,它必须有一个id属性,且该属性的值为"content_left"。@id="content_left"是一个条件(谓语),它指定了div元素必须满足的属性值。
3.//a:
	在找到了满足条件的div元素之后,这部分表示从该div元素开始,搜索其内部(包括所有子元素,无论层级多深)的所有a(锚点/链接)元素。
4.[contains(text(), "哔哩哔哩")]:
	这是另一个条件(谓语),它应用于前面找到的a元素。contains(text(), "哔哩哔哩")是个函数,它检查a元素的文本内容是否包含字符串"哔哩哔哩"。text()是一个函数,它返回元素的文本内容(不包括任何子元素的文本)。因此,这个条件会筛选出所有文本内容包含“哔哩哔哩”的a元素。综上所述,这个XPath表达式会查找整个文档中,位于ID为content_left的div元素内部(无论层级多深)的所有a元素,这些a元素的文本内容必须包含“哔哩哔哩”。

在实际应用中,这个表达式通常用于Selenium WebDriver等自动化测试工具中,以定位并操作网页上的特定元素。

2.在百度的首页上搜索B站后打开B站-在B站搜索框中搜索Selenium

代码如下(示例):

# 导入 Selenium WebDriver 的 Chrome 浏览器驱动模块
# 导入 Selenium 的 expected_conditions 模块,并将其重命名为 EC,用于定义等待元素时的预期条件
from selenium.webdriver.support import expected_conditions as EC
# 导入 WebDriverWait 类,用于实现智能等待,等待元素满足预期条件
from selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver
# 导入用于元素定位的 By 类
from selenium.webdriver.common.by import By
# 导入 time 模块用于暂停执行
import time

# 创建一个 Chrome 浏览器的实例
# 这里假设 chromedriver 已正确配置在系统 PATH 中,或者提供了 chromedriver 的路径
driver = webdriver.Chrome()
# 创建一个 Chrome 浏览器的 WebDriver 对象,以便后续操作浏览器,如打开网页、查找元素、执行操作等


# 使用 driver 对象打开百度首页的 URL
driver.get('https://www.baidu.com')
# 让浏览器打开百度的首页,使用 get 方法加载百度的网址


# 使用 find_element 方法通过 XPATH 定位百度搜索框
# XPATH 表达式 '//input[@id="kw"]' 用于选择 ID 为 "kw" 的 input 元素,即搜索框
search_box = driver.find_element(By.XPATH, '//input[@id="kw"]')
# 通过 XPATH 表达式查找百度搜索框元素,使用 find_element 方法结合 By.XPATH 定位方式,根据提供的 XPATH 表达式找到对应的元素,并将其存储在 search_box 变量中


# 在搜索框中输入搜索关键词“B站”
search_box.send_keys('B站')
# 在找到的搜索框元素(search_box)中输入搜索关键词 "B站",使用 send_keys 方法模拟键盘输入操作


# 提交搜索,这通常是通过点击搜索框旁边的搜索按钮或通过按下回车键来实现的
# 但由于我们已经通过 send_keys 输入了关键词,并且搜索框通常具有搜索功能,
# 因此调用 submit() 方法将触发搜索
search_box.submit()
# 调用搜索框元素的 submit 方法提交搜索,相当于点击搜索按钮或按下回车键进行搜索操作


# 等待搜索结果页面加载
# 这里使用简单的 time.sleep() 方法暂停执行 3 秒
# 在实际项目中,为了提高效率和可靠性,推荐使用 WebDriverWait 等更精确的等待方式
time.sleep(3)
# 调用 time 模块的 sleep 方法,暂停程序执行 3 秒,目的是等待百度搜索结果页面加载完成,但这种等待方式不够灵活,可能会导致等待时间过长或过短


# 查找搜索结果中第一个包含 "哔哩哔哩" 文本的元素
# 使用 find_elements 方法返回所有匹配的元素列表
# XPATH 表达式 '//div[@id="content_left"]//a[contains(text(), "哔哩哔哩")]' 用于在 ID 为 "content_left" 的 div 内
# 查找所有 a 元素,这些元素的文本内容包含 "哔哩哔哩"
results = driver.find_elements(By.XPATH, '//div[@id="content_left"]//a[contains(text(), "哔哩哔哩")]')
# 使用 find_elements 方法结合 By.XPATH 定位方式,根据提供的 XPATH 表达式查找搜索结果中所有包含 "哔哩哔哩" 文本的元素,并将结果存储在 results 列表中


# 如果找到了至少一个匹配项,则点击第一个元素
if results:
    results[0].click()
# 检查 results 列表是否不为空,如果不为空,点击列表中的第一个元素,通常用于跳转到第一个匹配的搜索结果页面


# 在实际自动化测试中,通常不需要这样的延迟,除非有特定的需求
time.sleep(5)
# 再次调用 time 模块的 sleep 方法,暂停程序执行 5 秒,可能是为了等待某些元素加载完成或进行一些其他操作,根据具体需求而定


# 获取所有打开的窗口句柄
window_handles = driver.window_handles
# 使用 window_handles 属性获取当前打开的所有窗口的句柄列表,句柄可以用来唯一标识不同的窗口


# 假设我们要切换到新打开的窗口,这里假设是最后一个打开的窗口
handle = window_handles[-1]
# 从窗口句柄列表中选取最后一个元素作为要切换的窗口句柄,存储在 handle 变量中,假设新打开的窗口是最后一个


# 切换到新打开的窗口
driver.switch_to.window(handle)
# 使用 switch_to.window 方法,将浏览器的焦点切换到 handle 所代表的窗口,即切换到新打开的窗口


# 查找搜索框元素,使用智能等待
# 使用 By.CLASS_NAME 定位元素
search_bilibili = WebDriverWait(driver, 30).until(
    EC.presence_of_element_located((By.XPATH, '//input[@class="nav-search-input"]'))
)
# 使用 WebDriverWait 类结合 expected_conditions 模块的 presence_of_element_located 条件,等待 30 秒,直到找到具有 class 为 nav-search-input 的元素出现,找到后存储在 search_bilibili 变量中


# 在搜索框中输入搜索关键词 “Selenium”
search_bilibili.send_keys('Selenium')
# 在找到的搜索框元素(search_bilibili)中输入 "Selenium" 作为新的搜索关键词,使用 send_keys 方法模拟键盘输入操作


# 提交搜索框中的内容
search_bilibili.submit()
# 调用搜索框元素(search_bilibili)的 submit 方法提交搜索,开始新的搜索操作


time.sleep(5)
# 调用 time 模块的 sleep 方法,暂停程序执行 5 秒,可能是为了等待搜索结果页面加载或进行一些其他操作


# 打印当前浏览器窗口的标题
print(driver.title)
# 使用 print 函数输出当前浏览器窗口的标题,可用于验证操作是否成功或检查当前页面是否符合预期


# 关闭浏览器
driver.quit()
# 调用 driver 的 quit 方法关闭浏览器,释放资源,结束程序运行

3.对切换窗口的详细介绍

  1. window_handles = driver.window_handles:
  • driver.window_handles:这是 Selenium 的 WebDriver 对象(这里是
    driver)的一个属性,它返回一个列表,其中包含了当前浏览器会话中所有打开窗口的句柄。窗口句柄是一个唯一的标识符,用于区分不同的浏览器窗口或标签页。
  • window_handles:将这个句柄列表存储在 window_handles 变量中,以便后续操作。
  1. handle = window_handles[-1]:
  • window_handles[-1]:通过列表的索引操作,这里使用 [-1]
    表示选择列表中的最后一个元素。在多窗口操作的情况下,这通常是最新打开的窗口或标签页的句柄。
  • handle:将最后一个窗口句柄存储在 handle 变量中,方便后续使用。
  1. driver.switch_to.window(handle):
  • driver.switch_to.window(handle):这是 WebDriver
    对象的一个方法,它允许你将浏览器的焦点切换到指定的窗口或标签页。这里的 handle
    是之前获取的窗口句柄,调用该方法后,后续的操作将在该窗口中执行,而不是在原始窗口。

4.对上方的两个模块的详细介绍

# 查找搜索框元素,使用智能等待
# 使用 By.CLASS_NAME 定位元素
search_bilibili = WebDriverWait(driver, 30).until(
    EC.presence_of_element_located((By.XPATH, '//input[@class="nav-search-input"]'))
)
# 使用 WebDriverWait 类结合 expected_conditions 模块的 presence_of_element_located 条件,等待 30 秒,直到找到具有 class 为 nav-search-input 的元素出现,找到后存储在 search_bilibili 变量中
)

WebDriverWait(driver, 30):

  • WebDriverWait 是 Selenium 提供的一个等待类,用于实现智能等待功能。
  • driver:是一个已经初始化的 WebDriver 实例,例如
    webdriver.Chrome(),代表了一个浏览器会话,用于控制浏览器的操作,如打开页面、查找元素等。
  • 30:表示等待的最长时间,单位为秒。这意味着程序将等待最多 30 秒,以满足后续指定的条件。

EC.presence_of_element_located((By.XPATH, ‘//input[@class=“nav-search-input”]’)):

  • EC 是 expected_conditions 的别名,是 selenium.webdriver.support
    模块中的一个子模块,提供了一系列预定义的等待条件,用于判断元素或页面是否达到某种期望状态。
  • presence_of_element_located:是 EC 中的一个等待条件方法,用于检查元素是否存在于 DOM
    中,但不要求元素可见或可交互。
  • (By.XPATH, ‘//input[@class=“nav-search-input”]’):是一个定位器元组,其中: By.XPATH:表示使用 XPATH 来定位元素。 ‘//input[@class=“nav-search-input”]’:是一个
    XPATH 表达式,用于定位元素。在这个例子中,它的作用是查找具有 class 属性值为 nav-search-input 的 input
    元素。这个 XPATH 表达式会在整个 HTML 文档中搜索满足条件的元素。

until 方法:

  • until 是 WebDriverWait 类的一个方法,它接收一个条件作为参数(这里是
    EC.presence_of_element_located((By.XPATH,
    ‘//input[@class=“nav-search-input”]’))。
  • 该方法会在指定的等待时间内(这里是 30 秒)不断地检查条件是否满足。
  • 一旦条件满足(即找到 class 为 nav-search-input 的 input 元素),until 方法将返回该元素,存储在 search_bilibili 变量中。
  • 如果在 30 秒内条件未满足,将抛出 TimeoutException,表示等待超时。

常见使用场景: 页面元素加载等待:

  • 在自动化测试或网页自动化任务中,页面加载速度可能会因网络状况、服务器响应时间等因素而有所不同。使用这种智能等待方式可以确保在操作元素之前,元素已经加载到页面的 DOM 中,避免因元素尚未加载而导致的 NoSuchElementException 错误。
  • 例如,当你打开一个网页并需要操作一个搜索框时,你可以使用这个等待条件确保搜索框元素已经存在于页面的 DOM 中,然后再进行输入或点击操作。

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文复习了XPATH语法是什么,介绍了对切换窗口的详细介绍和from selenium.webdriver.support import expected_conditions as EC:和from selenium.webdriver.support.wait import WebDriverWait两个模块的使用。

你可能感兴趣的:(python,selenium,开发语言,xml,html)