草庐IT

Python selenium自动化操作Chrome浏览器

与自己作战 2024-01-21 原文


活动地址:CSDN21天学习挑战赛

文章目录

一、Selenium搭建环境

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持目前比较主流的浏览器。它也实现了诸多自动化功能,比如软件自动化测试,检测软件与浏览器兼容性,自动录制、生成不同语言的测试脚本,以及自动化爬虫等。

1、安装

pip install selenium

2、安装Chrome安装浏览器驱动WebDriver

Chrome驱动下载地址:http://chromedriver.storage.googleapis.com/index.html

1)查看Chrome浏览器版本

2)在驱动器版本里选择一个版本相近的




3)常用方法或属性

driver 常用方法或属性说明
close() 关闭当前标签页
quit() 关闭浏览器
forward() 页面前进
back() 页面返回
page_source 当前标签页浏览器渲染之后的网页源代码
current_url 当前标签页的url
screen_shot(img_name) 页面截图

(1)实战有界面

from selenium import webdriver
import time

# 创建Chrome浏览器对象
browser = webdriver.Chrome()

# 发送请求
browser.get('https://www.baidu.com/')

# 打印标题
print(browser.title)

# 延迟几秒看下浏览器
time.sleep(3)

# 退出浏览器
browser.quit()

(2)实战无界面

headless支持无界面命令模式

注意:chrome_options已经弃用了,改为options即可

DeprecationWarning: use options instead of chrome_options


from selenium import webdriver

# 创建Chrome浏览器对象
chrome_opt = webdriver.ChromeOptions()
# 开启无界面模式
chrome_opt.add_argument('--headless')
# 禁用gpu
chrome_opt.add_argument('--disable-gpu')

# 实例化配置带有driver对象
browser = webdriver.Chrome(options=chrome_opt)
# 发送请求
browser.get('https://www.baidu.com/')

# 打印标题
print(browser.title)

# 退出浏览器
browser.quit()

(3)常用参数说明

常用参数说明
--user-agent=""设置请求头的User-Agent
--window-size=1280x1024设置浏览器分辨率(窗口大小)
--start-maximized最大化运行(全屏窗口),不设置,取元素会报错
--disable-infobars禁止使用浏览器正在被自动化程序控制的提示
--incognito隐身模式(无痕模式)
--hide-scrollbars隐藏滚动条, 应对一些特殊页面
--disable-javascript禁止使用javascript
--blink-settings=imagesEnabled=false不加载图片, 提升速度
--headless浏览器无界面
--ignore-certificate-errors禁止使用扩展插件并实现窗口最大化
--disable-gpu禁止使用GPU加速
–disable-software-rasterizer禁止使用谷歌浏览器GPU加速-配置2(linux上用)
--disable-extensions禁止使用扩展插件
--start-maximized最大化运行(全屏窗口)

(4)八中元素定位方法

  • 老版本方法
定位方法说明
find_element_by_id() 元素的id来定位
find_element_by_name() 元素的name来定位
find_element_by_tag_name() 元素的标签名来定位
find_element_by_class_name() 元素的class来定位
find_element_by_link_text() 元素标签对之间的文字信息来定位
find_element_by_partrial_link_text() 元素标签对之间的部分文字信息来定位
find_element_by_xpath() 1、用标签名的层级关系来定位元素的绝对路径
2、用元素的属性来定位
find_element_by_css_selector() id、class、元素、属性、层级等都多种定位方法
  • 新版本方法
    注意:

获取单个元素
driver.find_element()

find_element(By.ID, 'kw')
find_element(by=By.ID, value='kw')

获取多个元素
driver.find_elements()

find_elements(By.ID, 'kw')
find_elements(by=By.ID, value='kw')
  • 案例
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 打开chrome浏览器
driver = webdriver.Chrome()
# 打开百度搜索页面
driver.get('http://www.biqugse.com/')
# 通过id定位元素
id = driver.find_element(By.ID, 'wrapper')
print(id)
# 通过name定位元素
name = driver.find_element(By.NAME, 'password')
print(name)
# 通过name定位多元素
names = driver.find_elements(By.NAME, 'password')
print(names)
# 定位class元素
class_name = driver.find_element(By.CLASS_NAME, 'cc')
print(class_name)
# 定位class_name多元素
class_names = driver.find_elements(By.CLASS_NAME, 'cc')
print(class_names)
# 通过xpath来获取元素
xpath = driver.find_element(By.XPATH, '//*[@id="wrapper"]/div[6]/div/p[2]')
print(xpath)
print(xpath.text)
# 通过link_text标签来获取元素(精确定位)
link_text = driver.find_element(By.LINK_TEXT, '设为首页')
print(link_text)
# 通过link_text标签来获取元素(模糊定位)
partial_link_text = driver.find_element(By.PARTIAL_LINK_TEXT, '首页')
print(partial_link_text)
# 通过tag标签来获取元素
tag = driver.find_element(By.TAG_NAME, 'img')
print(tag)
# 强制等待2秒查看效果
time.sleep(2)
# 关闭浏览器
driver.quit()

结果:

D:\python383\python.exe D:/pythonproject/csdn/RequestsDemo.py
<selenium.webdriver.remote.webelement.WebElement (session="d4a0544fde3220aa6c6d73d10f4eef7d", element="6d607d2d-cc8e-46a1-87ac-bf4c1324fb98")>
================================================================================	分割线	================================================================================
<selenium.webdriver.remote.webelement.WebElement (session="d4a0544fde3220aa6c6d73d10f4eef7d", element="1cca4773-69f9-4059-b29c-e534b907af6c")>
[<selenium.webdriver.remote.webelement.WebElement (session="d4a0544fde3220aa6c6d73d10f4eef7d", element="1cca4773-69f9-4059-b29c-e534b907af6c")>]
================================================================================	分割线	================================================================================
<selenium.webdriver.remote.webelement.WebElement (session="d4a0544fde3220aa6c6d73d10f4eef7d", element="09e4359e-d6fb-4c6e-881e-c25e53689cd7")>
[<selenium.webdriver.remote.webelement.WebElement (session="d4a0544fde3220aa6c6d73d10f4eef7d", element="09e4359e-d6fb-4c6e-881e-c25e53689cd7")>, <selenium.webdriver.remote.webelement.WebElement (session="d4a0544fde3220aa6c6d73d10f4eef7d", element="f99f220f-70f1-4dae-970c-9a0a1c5f537c")>]
================================================================================	分割线	================================================================================
<selenium.webdriver.remote.webelement.WebElement (session="d4a0544fde3220aa6c6d73d10f4eef7d", element="61ef193c-bbf0-4619-b847-f7566b527a66")>
Copyright © 2021 笔趣阁 京ICP备88080001================================================================================	分割线	================================================================================
<selenium.webdriver.remote.webelement.WebElement (session="d4a0544fde3220aa6c6d73d10f4eef7d", element="ccfe2632-e494-49b2-bd4d-138642a4bc13")>
================================================================================	分割线	================================================================================
<selenium.webdriver.remote.webelement.WebElement (session="d4a0544fde3220aa6c6d73d10f4eef7d", element="ccfe2632-e494-49b2-bd4d-138642a4bc13")>
================================================================================	分割线	================================================================================
<selenium.webdriver.remote.webelement.WebElement (session="d4a0544fde3220aa6c6d73d10f4eef7d", element="aa815fdd-a8af-475b-bb4f-6214e137b118")>

Process finished with exit code 0

(5)元素的操作

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

# 打开chrome浏览器
driver = webdriver.Chrome()
# 打开百度搜索页面
driver.get('http://www.biqugse.com/')
# 通过id定位元素
# 通过xpath来获取元素文本信息
xpath = driver.find_element(By.XPATH, '//*[@id="wrapper"]/div[6]/div/p[2]')
print(xpath.text)
# 通过xpath来获取元素属性信息
xpath = driver.find_element(By.TAG_NAME, 'a')
print(xpath.get_attribute('href'))
# 强制等待2秒查看效果
time.sleep(2)
# 关闭浏览器
driver.quit()

(6)前进后退

# 前进
browser.forward()

# 后退 
browser.back()

(7)嵌套JS

from selenium import webdriver
import time
browser = webdriver.Chrome()
url = 'http://www.biqugse.com/'
browser.get(url)

# js语句  滚动条拉倒最底部
js = "var q=document.documentElement.scrollTop=10000"

# 执行js的方法
browser.execute_script(js)

time.sleep(3)
browser.quit()

有关Python selenium自动化操作Chrome浏览器的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  4. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  5. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  6. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  7. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  8. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  9. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  10. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

    a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

随机推荐