一文带你深入浅出Web的主动化测试工具Selenium 4.xx【发起收藏】 ...

打印 上一主题 下一主题

主题 974|帖子 974|积分 2922

前言

为了巩固所学的知识,作者尝试着开始发布一些学习条记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,接待读者朋友们批评指正。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问接待各人在批评区向我提出)
发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,不由得分享一下给各人。【宝藏入口】。
第01节 Selenium概述

Selenium 是一个Web的主动化测试工具,最初是为网站主动化测试而开发的,Selenium 可以直接运行
在浏览器上,它支持所有主流的浏览器
由于 Selenium 可以控制浏览器发送请求,并获取网页数据,因此可以应用于爬虫范畴
Selenium 可以根据我们的指令,让浏览器主动加载页面,获取需要的数据,乃至页面截屏,大概判定网
站上某些动作是否发生
Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器联合在一起才能使用
Selenium 库的版本不同对应的方法名也会有所不同
   官方文档:http://selenium-python.readthedocs.io/index.html
  第02节 安装浏览器驱动(以Google为例)

1. 确认浏览器版本

2. 下载对应版本的驱动


3. 如何下载历史版本的 chorm


  • 获得浏览器版本号
访问 https://vikyd.github.io/download-chromium-history-version/ ,可能需要科学上网(dddd),然后在 version 下拉里面选择你要的平台,然后在输入框输入版本号,例如 : windows 64位 113.0版本



  • 选择浏览器版本并下载压缩包

  • 下载完成后解压即可使用



  • 将 chromedriver.exe 生存到恣意位置,并把当前路径生存到环境变量中(我的电脑>>右键属性>>高级系统设置>>高级>>环境变量>>系统变量>>ath),添加的时间要注意不要把 path 变量给覆盖了,如果覆盖了千万别关机,然后百度。添加成功后使用下面代码进行测试。
  • 也可以尝试驱动文件在python安装目次大概和代码在同一个目次下
  • 大概在实例化webdriver对象的时间把驱动路径传进去
  1. # 导入 webdriver
  2. import time
  3. from selenium import webdriver
  4. # 调用环境变量指定的PhantomJS浏览器创建浏览器对象
  5. from selenium.webdriver.common.by import By
  6. driver = webdriver.Chrome()
  7. # get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择
  8. driver.get("https://www.baidu.com/")
  9. # id="kw"是百度搜索输入框,输入字符串"长城"
  10. driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("长城")
  11. # id="su"是百度搜索按钮,click() 是模拟点击
  12. driver.find_element(By.CSS_SELECTOR,"#su").click()
  13. time.sleep(20)
复制代码

第03节 定位页面元素

定位一个元素用 element,定位一组元素用 elements
1. 打开指定页面

1. 不切换新窗口
要使用 Selenium 来打开指定页面,首先需要初始化一个 WebDriver 实例,然后使用该实例打开目标页面。下面是一个使用 Python 和 Selenium 的示例,演示如何打开指定的页面:
  1. from selenium import webdriver
  2. # 初始化一个WebDriver实例,这里使用Chrome作为浏览器
  3. driver = webdriver.Chrome()
  4. # 打开指定的页面,将URL替换为你要访问的网页地址
  5. url = "https://www.example.com"
  6. driver.get(url)
  7. # 在这里,你可以执行与打开页面相关的操作
  8. # 最后,关闭浏览器窗口
  9. driver.quit()
复制代码
在上述代码中,我们首先导入 Selenium 的 webdriver 模块,并初始化了一个 Chrome 浏览器的 WebDriver 实例。然后,使用 get 方法打开指定的页面,将目标网页的 URL 替换为你要访问的网页地点。之后,你可以在页面上执行与你的测试或使命相关的操作,然后使用 quit 方法关闭浏览器窗口
2. 切换新窗口
上面的方法会在当前窗口或标签页中打开一个新的页面,将当前页面替换为新的 URL ,使用 window.open(url) 打开新页面:
  1. driver.execute_script("window.open('https://www.example.com', '_blank');")  # 使用JavaScript打开一个新页面
复制代码
这种方法使用 execute_script 方法执行 JavaScript 代码,在新的浏览器窗口或标签页中打开指定的 URL。'_blank' 参数告诉浏览器在新窗口或标签页中打开 URL。这种方式适用于在新窗口中打开页面,而不替换当前页面
请注意,如果你使用 window.open() 方法打开新页面,你可能需要使用 driver.window_handlesdriver.switch_to.window() 来管理不同砚口之间的切换,就像背面提到的窗口句柄一样。这可以让你在不同的浏览器窗口中执行操作
总之,execute_script 方法通常与其他 Selenium 方法一起使用,用于执行 JavaScript 以实现特定的交互和操作,但它本身不用于打开新页面
3. 保持浏览器窗口打开
默认环境下,Selenium WebDriver 在脚本执行结束后会关闭浏览器窗口,但通过将选项 "detach" 设置为 True,你可以使浏览器窗口保持打开状态,以便手动进行操作
  1. from selenium import webdriver
  2. # 创建ChromeOptions对象
  3. options = webdriver.ChromeOptions()
  4. # 添加选项,防止浏览器自动关闭
  5. options.add_experimental_option("detach", True)
  6. # 初始化一个WebDriver实例,将选项传递给Chrome
  7. driver = webdriver.Chrome(options=options)
  8. # 打开指定的页面
  9. url = "https://www.csdn.net"
  10. driver.get(url)
  11. # 在这里,你可以执行与打开页面相关的操作
  12. # 手动关闭浏览器时,可以保持它打开
复制代码
2. id 定位

要使用 Selenium 通过元素的 ID 进行定位,你可以使用 By.ID 选择器和 find_element 方法。以下是如何通过元素的ID进行定位的示例:
  1. from selenium import webdriver
  2. # 初始化一个WebDriver实例,这里使用Chrome作为浏览器
  3. driver = webdriver.Chrome()
  4. # 打开指定的页面
  5. url = "https://www.example.com"
  6. driver.get(url)
  7. # 通过元素的ID进行定位并执行操作
  8. element = driver.find_element(By.ID, "element_id")
  9. # 在这里,你可以执行与该元素相关的操作,例如单击、输入文本等
  10. element.click()
  11. # 最后,关闭浏览器窗口
  12. driver.quit()
复制代码
在上述示例中,driver.find_element(By.ID, "element_id") 通过元素的ID属性来定位元素,并将其存储在变量 element 中,然后可以执行与该元素相关的操作。记得将  "element_id" 替换为你要查找的元素的实际 ID。
3. name 定位

  1. # 通过元素的name属性进行定位并执行操作
  2. element = driver.find_element(By.NAME,"element_name")
复制代码
4. class 定位

  1. # 通过元素的CSS类名进行定位并执行操作
  2. element = driver.find_element(By.By.CLASS_NAME, ".element_class")
复制代码
5. tag 定位

每个 tag 往往用来界说一类功能,所以通过 tag 来识别某个元素的成功率很低,每个页面一般都用很多雷同的 tag
  1. # 通过元素的标签名进行定位并执行操作
  2. element = driver.find_element(By.TAG_NAME,"element_tag")
复制代码
element_tag 在示例代码中代表你要查找的元素的 HTML 标签名,例如 < div >, < a >, < p >等。具体来说,如果你要查找一个 < div > 元素,你可以将 element_tag 替换为 "div" ,如果你要查找一个 < a > 元素,你可以将 element_tag 替换为 "a",以此类推
6. xpath 定位

XPath(XML Path Language)是一种用于在 XML 文档中定位元素的语言,也适用于HTML 文档,由于 HTML 是一种基于 XML 的标记语言的变体。XPath 是一种功能强大的元素定位方法,它答应你准确地定位网页上的元素,无论它们在文档中的位置如何。以下是XPath定位的一些示例:
1. 通过元素名称定位:


  • 定位所有的链接元素://a
  • 定位所有的段落元素://p
  • 定位第一个标题元素://h1
2. 通过元素属性定位:


  • 定位具有特定 id 属性的元素:
    1. //*[@id='element_id']
    复制代码
  • 定位具有特定 class 属性的元素:
    1. //*[@class='element_class']
    复制代码
3. 通过文本内容定位:


  • 定位包含特定文本的元素
    1. //*[text()='要查找的文本']
    复制代码
  • 定位以特定文本开头的元素:
    1. //*[starts-with(text(), '开头文本')]
    复制代码
  • 定位包含特定文本的链接
    1. //a[contains(text(), '链接文本')]
    复制代码
4. 通过元素条理结构定位:


  • 定位父元素的子元素
    1. //div[@id='parent_id']/p(查找 id 属性为 'parent_id' 的 < div > 元素下的所有 < p > 元素)
    复制代码
  • 定位祖先元素的子元素
    1. //div[@class='grandparent_class']//span(查找 class 属性为 'grandparent_class' 的祖先元素下的所有< span >元素)
    复制代码
5. 使用逻辑运算符:


  • 定位同时满足多个条件的元素:
    1. //input[@type='text' and @name='username'](查找type属性为 'text' 且 name 属性为 'username' 的输入框)
    复制代码
这些只是 XPath 的一些根本示例,XPath具有非常丰富的语法和功能,你可以根据需要组合和定制不同的条件来定位元素。在Selenium中,你可以使用 find_element + By.XPATH 方法来实现 XPath 定位,例如:
  1. element = driver.find_element(By.XPATH,"//a[contains(text(), '链接文本')]
  2. ")
复制代码
这将查找包含特定文本的链接元素,你可以根据需要修改 XPath 表达式来定位不同的元素。
6. 示例
  1. <html>
  2.   <head>...<head/>
  3.   <body>
  4.     <div id="csdn-toolbar">
  5.       <div class="toolbar-inside">
  6.         <div class="toolbar-container">
  7.           <div class="toolbar-container-left">...</div>
  8.           <div class="toolbar-container-middle">
  9.             <div class="toolbar-search onlySearch">
  10.                         <div class="toolbar-search-container">
  11.                                 <input id="toolbar-search-input" autocomplete="off" type="text" value="" placeholder="C++难在哪里?">
复制代码
根据上面的标签需要定位 最后一行 input 标签,以下列出了四种方式,xpath 定位的方式多样并不唯一,使用时根据环境进行解析即可。
  1. # 绝对路径(层级关系)定位
  2. driver.find_element(By.XPATH,
  3.         "/html/body/div/div/div/div[2]/div/div/input[1]")
  4. # 利用元素属性定位
  5. driver.find_element(By.XPATH,
  6.         "//*[@id='toolbar-search-input']"))
  7. # 层级+元素属性定位
  8. driver.find_element(By.XPATH,
  9.         "//div[@id='csdn-toolbar']/div/div/div[2]/div/div/input[1]")
  10. # 逻辑运算符定位
  11. driver.find_element(By.XPATH,
  12.         "//*[@id='toolbar-search-input' and @autocomplete='off']")
复制代码
7. css 选择器

CSS 使用选择器来为页面元素绑定属性,它可以较为灵活的选择控件的恣意属性,一般定位速度比 xpath 要快,使用CSS 选择器进行元素定位在 Selenium 中黑白常常见和方便的。以下是一些常见的 CSS 选择器示例:
1. 通过元素名称定位:


  • 定位所有的链接元素a
  • 定位所有的段落元素p
  • 定位所有的按钮元素button
2. 通过元素ID定位:
定位具有特定 ID属性的元素:#element_id
  1. element = driver.find_element(By.CSS_SELECTOR,"#element_id")
复制代码
3. 通过类名定位:


  • 定位具有特定 class 属性的元素:.element_class
  1. element = driver.find_element(By.CSS_SELECTOR,".element_class")
复制代码
4. 通过元素属性定位:


  • 定位具有特定属性值的元素:[attribute=‘value’]
  1. element = driver.find_element(By.CSS_SELECTOR,"[name='username']")
复制代码
5. 通过属性值的部分匹配:


  • 定位包含特定属性值的元素:[attribute*=‘value’]
  1. element = driver.find_element(By.CSS_SELECTOR,"[href*='example.com']")
复制代码
6. 通过组合条件:


  • 定位同时满足多个条件的元素:.class1.class2
  1. element = driver.find_element(By.CSS_SELECTOR,".element_class1.element_class2")
复制代码
7. 子元素定位:


  • 定位父元素的子元素#parent_id > .child_class
  1. element = driver.find_element(By.CSS_SELECTOR,"#parent_id > .child_class")
复制代码
8. 伪类选择器:
例如 定位鼠标悬停的元素::hover
  1. element = driver.find_element(By.CSS_SELECTOR,"a:hover")
复制代码
8. link 定位

使用 Selenium 来定位超链接(link)元素通常涉及到查找带有 <a> 标签的元素,这是 HTML 中的链接标签。你可以使用不同的方法来定位超链接,如通过文本内容、链接文本、部分链接文本等。以下是一些常见的链接定位示例:
1.通过链接文本(完全匹配)定位:
使用链接的文本内容来定位,确保文本与链接完全匹配:
  1.    # 查找所有链接文本为"下一页"的元素
  2.    element = driver.find_elements(By.LINK_TEXT, "文本")
复制代码
2.通过链接文本(部分匹配)定位:
使用链接的部分文本内容来定位,可以匹配链接文本的一部分:
  1.    element = driver.find_element(By.PARTIAL_LINK_TEXT,"部分文本")
复制代码
例如,如果你的链接文本是"点击这里以获取更多信息",你可以使用"点击这里"或"获取更多信息"来进行部分匹配。
这些方法非常方便,特殊是当你知道链接的文本内容时。但请注意,它们对文本巨细写敏感,所以确保文本内容的巨细写与链接文本匹配。
要查找多个链接,你可以使用 find_element**s**(By.LINK_TEXT, "文本") 或 find_element**s**(By.PARTIAL_LINK_TEXT,"部分文本"),它们会返回一个元素列表,你可以在列表中迭代查找多个链接元素。
示例:
  1. elements = driver.find_elements(By.PARTIAL_LINK_TEXT,"部分文本")
  2. for element in elements:
  3.     print(element.text)
复制代码
这将打印所有包含"部分文本"的链接文本的链接元素。
9. 示例 有道翻译

访问有道翻译网站,输入单词,并获取翻译后的内容
  1. import time
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support.ui import WebDriverWait
  5. from selenium.webdriver.support import expected_conditions as EC
  6. # 创建ChromeOptions对象
  7. options = webdriver.ChromeOptions()
  8. # 添加选项,防止浏览器自动关闭
  9. options.add_experimental_option("detach", True)
  10. # 创建Chrome WebDriver
  11. driver = webdriver.Chrome(options=options)
  12. # 打开有道翻译页面
  13. driver.get("https://fanyi.youdao.com/")
  14. # 等待输入框可见
  15. input_element = WebDriverWait(driver, 10).until(
  16.     EC.presence_of_element_located((By.ID, "js_fanyi_input"))
  17. )
  18. # 输入内容
  19. input_element.send_keys("hello")
  20. # 如果有广告弹出框,关闭它
  21. try:
  22.     close_btn = driver.find_element(By.CSS_SELECTOR, ".close")
  23.     close_btn.click()
  24. except Exception:
  25.     pass  # 如果没有广告,继续执行
  26. # 等待翻译结果出现
  27. transTarget = WebDriverWait(driver, 10).until(
  28.     EC.presence_of_element_located((By.ID, "js_fanyi_output_resultOutput"))
  29. )
  30. # 输出翻译结果
  31. print(transTarget.text)
  32. # 关闭浏览器
  33. # driver.quit()
复制代码

第04节 浏览器控制

1. 修改浏览器窗口巨细

webdriver 提供 set_window_size() 方法来修改浏览器窗口的巨细
  1. from selenium import webdriver
  2. # 初始化浏览器驱动程序,这里使用Chrome作为示例
  3. driver = webdriver.Chrome()
  4. # 最大化浏览器窗口
  5. driver.maximize_window()
  6. # 或者设置特定大小的窗口
  7. # driver.set_window_size(1024, 768)  # 传递所需的宽度和高度
  8. # 访问网页
  9. driver.get("https://www.example.com")
  10. # 在这里执行其他操作...
  11. # 关闭浏览器
  12. driver.quit()
复制代码
2. 浏览器前进&后退

要在 Selenium 中执行浏览器的前进和后退操作,你可以使用 forward()back() 方法
  1. # 在这里执行其他操作...
  2. # 执行前进操作
  3. driver.forward()
  4. # 执行后退操作
  5. driver.back()
  6. # 在这里执行其他操作...
复制代码
请注意,前进和后退操作通常依赖于浏览器的历史记录。如果浏览器历史记录中没有前进或后退的页面,这些方法可能不会执行任何操作。因此,在使用前进和后退之前,确保浏览器已经访问了多个页面以建立历史记录
3. 浏览器刷新

要在Selenium中执行浏览器刷新操作,你可以使用refresh()方法。以下是一个示例,演示如何在Python中使用Selenium来刷新浏览器页面:
  1. from selenium import webdriver
  2. # 刷新浏览器页面
  3. driver.refresh()
复制代码
这个方法将会重新加载当前页面,就像用户手动点击浏览器的刷新按钮一样。刷新操作可用于重新加载页面内容,以确保你的测试脚本在页面状态变化时可以重新加载页面
4. 浏览器窗口切换

在 Selenium 中,要切换浏览器窗口,你可以使用 window_handles 属性来获取当前打开的所有窗口句柄,然后使用 switch_to.window() 方法切换到特定的窗口句柄。以下是一个示例,演示如何在 Python 中使用 Selenium 来切换浏览器窗口:
  1. from selenium import webdriver
  2. # 初始化浏览器驱动程序,这里使用Chrome作为示例
  3. driver = webdriver.Chrome()
  4. # 打开第一个网页
  5. driver.get("https://www.example1.com")
  6. # 打开第二个网页
  7. driver.execute_script("window.open('https://www.example2.com', '_blank');")
  8. # 获取所有窗口句柄
  9. window_handles = driver.window_handles
  10. # 切换到第二个窗口
  11. driver.switch_to.window(window_handles[1])
  12. # 在第二个窗口执行操作
  13. # 切换回第一个窗口
  14. driver.switch_to.window(window_handles[0])
  15. # 在第一个窗口执行操作
  16. # 关闭浏览器
  17. driver.quit()
复制代码
在上述示例中,我们首先打开两个不同的网页,然后使用 window_handles 获取所有窗口句柄。通过切换到不同的窗口句柄,我们可以在不同的浏览器窗口中执行操作
请注意,窗口句柄的索引通常是从 0 开始的,所以第一个窗口的句柄是 window_handles[0] ,第二个窗口的句柄是 window_handles[1] ,依此类推。你可以根据需要切换到其他窗口句柄以执行操作
   窗口句柄(Window Handle)是一个用来唯一标识浏览器窗口的标识符或引用。每当你打开一个新的浏览器窗口或标签页时,浏览器会为该窗口分配一个唯一的句柄。这些句柄是在浏览器级别分配的,用于标识不同的浏览器窗口或标签页,以便在多窗口浏览器环境中进行切换和操作
    在 Selenium 等主动化测试工具中,窗口句柄用于控制和切换不同的浏览器窗口,以便在多个窗口之间执行操作。通过获取窗口句柄,你可以将焦点从一个窗口切换到另一个窗口,从而执行各种操作,例如在不同砚口之间切换、操作弹出窗口等
    窗口句柄通常是一个字符串,你可以使用它来定位和操作特定的浏览器窗口。在 Selenium 中,你可以使用 window_handles 属性来获取当前打开的所有窗口句柄,然后使用 switch_to.window() 方法切换到特定的窗口句柄。这使得在多窗口浏览器环境中进行主动化测试或操作变得更加轻易
  5. 常见操作

当使用 Selenium WebDriver 或类似的主动化测试工具时,这些方法可以用于与 Web 页面的元素进行交互和获取信息。以下是每个方法的使用示例:
1. send_keys(): 模拟输入指定内容
  1. from selenium import webdriver
  2. driver = webdriver.Chrome()
  3. driver.get("https://example.com")
  4. # 找到输入框元素并输入文本
  5. input_element = driver.find_element_by_id("username")
  6. input_element.send_keys("myusername")
复制代码
在这个例子中,send_keys() 方法模拟在具有 id 为 “username” 的输入框中输入 “myusername”
2. clear(): 清除文本内容
  1. # 清除输入框中的文本
  2. input_element.clear()
复制代码
clear() 方法用于清除之前输入框中的文本内容
3. is_displayed(): 判定该元素是否可见
  1. # 检查元素是否可见
  2. if input_element.is_displayed():
  3.     print("Input element is visible on the page.")
  4. else:
  5.     print("Input element is not visible on the page.")
复制代码
is_displayed() 方法用于检查页面上的元素是否可见。在这个例子中,如果输入框可见,将会打印 “Input element is visible on the page.”
4. get_attribute(): 获取标签属性值
  1. # 获取元素的href属性值
  2. link_element = driver.find_element_by_link_text("Example Link")
  3. href_value = link_element.get_attribute("href")
  4. print("Href attribute value is:", href_value)
复制代码
get_attribute() 方法用于获取元素的指定属性的值。在这个例子中,它获取链接文本为 “Example Link” 的元素的 href 属性值
5. size: 返回元素的尺寸
  1. # 获取元素的宽度和高度
  2. element_size = input_element.size
  3. print("Element size is:", element_size)
复制代码
size 是一个属性,用于返回元素的宽度和高度。在这个例子中,它获取输入框元素的尺寸
6. text: 返回元素文本
  1. # 获取元素的文本内容
  2. paragraph_element = driver.find_element_by_css_selector("p")
  3. paragraph_text = paragraph_element.text
  4. print("Paragraph text is:", paragraph_text)
复制代码
text 是一个属性,用于返回元素的文本内容。在这个例子中,它获取 <p> 元素的文本内容
6. 示例 CSDN页面元素交互

  1. # coding=utf-8
  2. import time
  3. from selenium import webdriver
  4. from selenium.webdriver.common.by import By
  5. driver = webdriver.Chrome()
  6. driver.get('https://www.csdn.net/')
  7. time.sleep(2)
  8. # 定位搜索输入框
  9. text_label = driver.find_element(By.ID, "toolbar-search-input")
  10. # 在搜索框中输入 东离与糖宝
  11. text_label.send_keys('东离与糖宝')
  12. time.sleep(2)
  13. # 清除搜索框中的内容
  14. text_label.clear()
  15. time.sleep(2)
  16. # 输出搜索框元素是否可见
  17. print(text_label.is_displayed())
  18. # 输出placeholder的值
  19. print(text_label.get_attribute('placeholder'))
  20. # 定位搜索按钮
  21. button = driver.find_element(By.ID, 'toolbar-search-button')
  22. # 输出按钮的大小
  23. print(button.size)
  24. # 输出按钮上的文本
  25. print(button.text)
  26. '''输出内容
  27. True
  28. 搜CSDN
  29. {'height': 32, 'width': 88}
  30. 搜索
  31. '''
复制代码
第05节 鼠标控制

1.单击元素

左键不需要用到 ActionChains
  1. from selenium import webdriver
  2. from selenium.webdriver.common.action_chains import ActionChains
  3. driver = webdriver.Chrome()
  4. driver.get("https://example.com")
  5. element = driver.find_element_by_id("my_element")
  6. # 单击元素
  7. ActionChains(driver).click(element).perform()
复制代码
2.双击元素

  1. # 双击元素
  2. ActionChains(driver).double_click(element).perform()
复制代码
3.在元素上右键单击

  1. # 右键单击元素
  2. ActionChains(driver).context_click(element).perform()
复制代码
4.在元素上悬停(鼠标悬停)

模拟悬停的作用一般是为了显示隐藏的下拉框
  1. # 鼠标悬停在元素上
  2. ActionChains(driver).move_to_element(element).perform()
复制代码
5.拖拽元素到另一个位置

  1. # 拖拽元素到目标位置
  2. target_element = driver.find_element_by_id("target_element")
  3. ActionChains(driver).drag_and_drop(element, target_element).perform()
复制代码
第06节 键盘控制

1.输入文本

使用 send_keys 方法可以将文本输入到活动元素中,就像用户手动键入一样
  1. from selenium import webdriver
  2. driver = webdriver.Chrome()
  3. driver.get("https://example.com")
  4. # 定位到文本输入框并输入文本
  5. text_input = driver.find_element_by_id("my_textbox")
  6. text_input.send_keys("Hello, World!")
复制代码
2.按键

使用 send_keys 方法可以模拟特定按键的操作,如回车键、退格键、Tab键等。
  1. from selenium import webdriver
  2. from selenium.webdriver.common.keys import Keys
  3. driver = webdriver.Chrome()
  4. driver.get("https://example.com")
  5. # 模拟按下回车键
  6. text_input = driver.find_element_by_id("my_textbox")
  7. text_input.send_keys(Keys.ENTER)
复制代码
3.组合键

你可以使用 Keys 类来模拟键盘上的组合键,例如 Ctrl+C(复制)和Ctrl+V(粘贴)。
  1. from selenium import webdriver
  2. from selenium.webdriver.common.keys import Keys
  3. driver = webdriver.Chrome()
  4. driver.get("https://example.com")
  5. # 模拟Ctrl+C(复制)
  6. text_input = driver.find_element_by_id("my_textbox")
  7. text_input.send_keys(Keys.CONTROL, 'c')
  8. # 模拟Ctrl+V(粘贴)
  9. another_text_input = driver.find_element_by_id("another_textbox")
  10. another_text_input.send_keys(Keys.CONTROL, 'v')
复制代码
4. 其他键盘操作

操作形貌Keys.F1F1键Keys.SPACE空格Keys.TABTab键Keys.ESCAPEESC键Keys.ALTAlt键Keys.SHIFTShift键Keys.ARROW_DOWN向下箭头Keys.ARROW_LEFT向左箭头Keys.ARROW_RIGHT向右箭头Keys.ARROW_UP向上箭头 第07节 元素期待

现在的大多数的 Web 应用步伐是使用 Ajax 技术。当一个页面被加载到浏览器时, 该页面内的元素可以在不同的时间点被加载。这使得定位元素变得困难, 如果元素不再页面之中,会抛出 ElementNotVisibleException 异常。 使用 waits, 我们可以解决这个问题。waits 提供了一些操作之间的时间隔断- 紧张是定位元素或针对该元素的任何其他操作。
Selenium Webdriver 提供两种类型的 waits - 隐式和显式。 显式期待会让 WebDriver 期待满足一定的条件以后再进一步的执行。 而隐式期待让 Webdriver 期待一定的时间后再才是查找某元素。
1. 隐式期待

隐式期待(Implicit Wait):设置一个全局期待时间,如果 Selenium 无法立即找到元素,它会期待指定的时间,然后再次尝试。这对于整个测试过程都适用
  1. from selenium import webdriver
  2. driver = webdriver.Chrome()
  3. driver.implicitly_wait(10)  # 设置等待时间为10秒
  4. driver.get("https://example.com")
  5. element = driver.find_element_by_id("myElement")
复制代码
2. 显示期待

显式期待(Explicit Wait):显式期待答应你为特定操作期待特定条件。你可以期待元素可见、可点击等条件。
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC
  5. driver = webdriver.Chrome()
  6. driver.get("https://example.com")
  7. # 等待元素可见
  8. element = WebDriverWait(driver, 10).until(
  9.     EC.visibility_of_element_located((By.ID, "myElement"))
  10. )
  11. # 等待元素可点击
  12. element = WebDriverWait(driver, 10).until(
  13.     EC.element_to_be_clickable((By.ID, "myElement"))
  14. )
复制代码
3. 自界说期待

自界说期待:你还可以根据需要创建自界说期待条件。例如,你可以期待元素的文本内容等于特定值。
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. def wait_for_element_with_text(driver, by, value, text, timeout=10):
  5.     return WebDriverWait(driver, timeout).until(
  6.         lambda driver: driver.find_element(by, value).text == text
  7.     )
  8. driver = webdriver.Chrome()
  9. driver.get("https://example.com")
  10. # 等待元素文本内容等于特定值
  11. wait_for_element_with_text(driver, By.ID, "myElement", "Hello, World!")
复制代码
4. 强制期待

将隐式期待改为强制期待(使用 time.sleep())通常不是一个好的做法,由于它会导致代码效率低下而且可能会浪费时间。
  1. import time
  2. from selenium import webdriver
  3. driver = webdriver.Chrome()
  4. driver.get("https://example.com")  # 替换为你要访问的网页URL
  5. # 假设你已经定位到了包含文本的 WebElement 对象
  6. element = driver.find_element_by_css_selector("span.red-packet-icon-mini > span.num")
  7. # 使用强制等待
  8. time.sleep(5)  # 强制等待 5 秒
  9. # 获取 <span> 元素的文本内容
  10. text_content = element.text
  11. # 打印文本内容
  12. print(text_content)
复制代码
值得一提的是,对于定位不到元素的时间,从耗时方面隐式期待和强制期待没什么区别
第08节 切换操作

在 selenium 操作页面的时间,可能会由于点击某个链接而跳转到一个新的页面(打开了一个新标签页),这时间 selenium 实际还是处于上一个页面的,需要我们进行切换才能够定位最新页面上的元素。
窗口切换需要使用 switch_to.windows() 方法。
1. 窗口切换

在 selenium 操作页面的时间,可能会由于点击某个链接而跳转到一个新的页面(打开了一个新标签页),这时间 selenium 实际还是处于上一个页面的,需要我们进行切换才能够定位最新页面上的元素。
窗口切换需要使用 switch_to.windows() 方法。
  1. from selenium import webdriver
  2. handles = []
  3. driver = webdriver.Chrome()
  4. driver.get('https://blog.csdn.net/')
  5. # 设置隐式等待
  6. driver.implicitly_wait(3)
  7. # 获取当前窗口的句柄
  8. handles.append(driver.current_window_handle)
  9. # 点击 python,进入分类页面
  10. driver.find_element_by_xpath('//*[@id="mainContent"]/aside/div[1]/div').click()
  11. # 切换窗口
  12. driver.switch_to.window(driver.window_handles[-1])
  13. # 获取当前窗口的句柄
  14. handles.append(driver.current_window_handle)
  15. print(handles)
  16. print(driver.window_handles)
复制代码

上面代码在点击跳转后,使用 switch_to 切换窗口,window_handles返回的 handle 列表是按照页面出现时间进行排序的,最新打开的页面肯定是最后一个,这样用 driver.window_handles[-1] + switch_to 即可跳转到最新打开的页面了。
那如果打开的窗口有多个,如何跳转到之前打开的窗口,如果确实有这个需求,那么打开窗口是就需要记录每一个窗口的 key(别名) 与 value(handle),生存到字典中,后续根据 key 来取 handle 。
2. 表单切换

1. iframe 切换
很多页面也会用带 frame/iframe 表单嵌套,对于这种内嵌的页面 selenium 是无法直接定位的,需要使用 switch_to.frame() 方法将当前操作的对象切换成 frame/iframe 内嵌的页面。
switch_to.frame() 默认可以用的 id 或 name 属性直接定位,但如果 iframe 没有 id 或 name ,这时就需要使用 xpath 进行定位。
  1.    iframe = driver.find_element(By.ID, "my-iframe-id")
  2.    driver.switch_to.frame(iframe)
复制代码
2.切换回默认内容:
如果在 iframe 中完成操作后,要切换回主页面,可以使用 switch_to.default_content() 方法:
  1.    driver.switch_to.default_content()
复制代码
这些方法可以帮助你在 Selenium 中进行窗口和 iframe 的切换操作。记着,切换窗口或 iframe 之前,你需要获取到对应的窗口句柄或 iframe 元素。
3. 举例
确切地,要找到位于 iframe 中的元素,你需要按照以下步骤进行操作:
1.首先,你需要找到 iframe 元素本身,然后切换到该 iframe
2.在 iframe 内部,你可以使用常规的方法来查找和操作元素
以下是一个示例,演示如何切换到 iframe 并找到其中的元素:
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. driver = webdriver.Chrome()
  4. driver.get("https://example.com")
  5. # 找到 iframe 元素,可以根据其 ID、名称或其他属性来定位
  6. iframe = driver.find_element(By.ID, "my-iframe-id")
  7. # 切换到 iframe
  8. driver.switch_to.frame(iframe)
  9. # 在 iframe 中查找元素并执行操作
  10. element_inside_iframe = driver.find_element(By.CLASS_NAME, "element-class")
  11. element_inside_iframe.click()
  12. # 切换回主页面
  13. driver.switch_to.default_content()
复制代码
在这个示例中,我们首先通过其 ID 找到了 iframe 元素,然后使用 driver.switch_to.frame() 切换到了 iframe 中,接下来在 iframe 内查找元素并执行操作。最后,使用 driver.switch_to.default_content() 切换回主页面。
记着,要确保你准确找到了 iframe 元素,以及在切换到 iframe 后,使用 driver.find_element() 方法来查找位于 iframe 内部的元素。
第09节 滚轮操作

要在 Selenium 中模拟滚轮操作,你可以使用 ActionChains 类的 send_keys 方法,将 Keys.PAGE_DOWN 或 Keys.SPACE 等按键发送到页面。这将模拟向下滚动页面。
在你的示例代码中,你已经创建了一个 ActionChains 对象,所以你只需要在循环中使用 send_keys 方法来模拟滚轮操作。以下是如何修改你的代码以模拟滚轮向下滚动:
  1. from selenium.webdriver.common.keys import Keys
  2. # ...
  3. # 计算滚动的时间间隔(以毫秒为单位)
  4. scroll_interval = 500  # 每500毫秒滚动一次
  5. # 创建ActionChains对象
  6. action_chains = ActionChains(driver)
  7. # 模拟滚动
  8. for _ in range(int(scroll_duration * 1000 / scroll_interval)):
  9.     action_chains.send_keys(Keys.PAGE_DOWN).perform()
  10.     time.sleep(scroll_interval / 1000)
复制代码
这段代码会模拟按下 Page Down 键来滚动页面。你可以根据需要调整 scroll_interval 和 scroll_duration 来控制滚动的速度和持续时间。
总结

接待各位留言交流以及批评指正,如果文章对您有帮助大概觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问接待各人在批评区向我提出)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表