草庐IT

Python + Selenium自动化测试

我亲手种的. 2023-12-23 原文

一、python

1、python下载与安装

官方下载地址:Python Releases for Windows | Python.orghttps://www.python.org/downloads/windows/

下载应用程序,双击运行

选择install now进行安装,下方勾选第二个选项系统可自动添加环境变量

 

等待python安装

 安装完成后,点击“Close”关闭

进入cmd验证是否已完成安装:

python -V

出现版本号则安装成功

2、pycharm下载与安装

官方下载地址:Download PyCharm: Python IDE for Professional Developers by JetBrainsDownload the latest version of PyCharm for Windows, macOS or Linux.https://www.jetbrains.com/pycharm/download/#section=windows

进入官方下载地址

 专业版:付费但是可以试用

 社区版:免费

这里我们下载社区版就可以(左边是专业版,右边社区版)。觉得社区版不好用的兄弟可以下载专业版进行破解,百度有很多教程,这里我就不多讲了。

点击Download进行下载,下载完成后得到一个可执行文件

双击运行,点击Next

可使用默认安装目录,也可以自定义目录。点击Next 

 勾选选项后,点击“Next”

 

点击“Install”进行安装 ,安装完成需要等待一等钟左右

安装完成后点击“Finish”

 二、Selenium

1、Selenium简介

Selenium 是最广泛使用的开源 Web UI(用户界面)自动化测试套件之一。Selenium 支持的语言包括C#,Java,Perl,PHP,Python 和 Ruby。目前,Selenium Web 驱动程序最受 Python 和 C#欢迎。 Selenium 测试脚本可以使用任何支持的编程语言进行编码,并且可以直接在大多数现代 Web 浏览器中运行。

2、selenium安装

selenium的安装

打开 cmd,输入下面命令进行安装。

pip install selenium
# 如果第一个命令无法安装可以使用第二个
pip3 install selenium

3、浏览器驱动

针对不同的浏览器,需要安装不同的驱动。下面列举了常见的浏览器与对应的驱动程序下载链接。

  • Firefox 浏览器驱动:Firefox
  • Chrome 浏览器驱动:Chrome
  • IE 浏览器驱动:IE
  • Edge 浏览器驱动:Edge

这里以安装 Chrome 驱动作为演示。

在新标签页输入 chrome://settings/ 进入设置界面,然后选择 【关于 Chrome

查看自己的版本信息。下载对应版本的 Chrome 驱动即可。

下载驱动

打开 Chrome驱动 。单击对应的版本。

 

 根据自己的操作系统,选择下载。

 下载完成后,压缩包内只有一个 exe 文件。

将 chromedriver.exe 保存到python安装目录

 

 4、selenium元素定位        

下面我们再来看看几种常见的页面元素定位方式。

元素示例:

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">

id 定位

标签的 id 具有唯一性。我们可以通过 id 定位到它,由于 id 的唯一性,我们可以不用管其他的标签的内容。

driver.find_element_by_id("kw")

name 定位

name 指定标签的名称,在页面中可以不唯一。

driver.find_element_by_name("wd")

class 定位

class 指定标签的类名,在页面中可以不唯一。

driver.find_element_by_class_name('s_ipt')

link 定位

link 专门用来定位文本链接,假如要定位下面这一标签。

<a href="#" target="_blank" class="mnav c-font-normal c-color-t">贴吧</a>

使用 find_element_by_link_text 并指明标签内全部文本即可定位。

driver.find_element_by_link_text("贴吧")

xpath 定位

xpath 是一种在 XML 文档中定位元素的语言,它拥有多种定位方式,下面通过实例我们看一下它的几种使用方式。

<html>
  <head>...<head/>
  <body>
    <div id="aa">
      <div class="bb">
        <div class="cc">
          <div class="dd">...</div>
          <div class="ff">
            <div class="ee">
			<div class="hh">
				<input id="ww" autocomplete="off" type="text" value="" placeholder="自动化测试">

根据上面的标签需要定位 最后一行 input 标签,以下列出四种方式,xpath 定位的方式多样并不唯一,使用时根据情况进行解析

# 绝对路径(层级关系)定位
driver.find_element_by_xpath("/html/body/div/div/div/div[2]/div/div/input[1]")

# 利用元素属性定位
driver.find_element_by_xpath("//*[@id='ww']"))

# 层级+元素属性定位
driver.find_element_by_xpath("//div[@id='aa']/div/div/div[2]/div/div/input[1]")

# 逻辑运算符定位
driver.find_element_by_xpath("//*[@id='ww' and @autocomplete='off']")

css 定位

CSS 使用选择器来为页面元素绑定属性,它可以较为灵活的选择控件的任意属性,一般定位速度比 xpath 要快,但使用起来略有难度。

举个简单的例子,同样定位上面实例中的 input 标签

# 选择 id = 'aa' 的元素
driver.find_element_by_css_selector('#aa')

# 选择div class='hh'下面的input元素
driver.find_element_by_css_selector('div[class="hh"]>input')

注意:以上定位元素的方式是本人常用的,还有一些其他方式可上网查找。

5、浏览器控制

修改浏览器大小

webdriver 提供方法来修改浏览器窗口的大小。

from selenium import webdriver

# 设置浏览器浏览器的宽高为:600x800
driver.set_window_size(600, 800)

#全屏
driver.maximize_window()

浏览器前进、后退、刷新

from selenium import webdriver

#返回(后退)
driver.back()

#前进
driver.forward()

#刷新
driver.refresh()

关闭浏览器

# 关闭当前窗口
driver.close()

# 退出浏览器
driver.quit()

6、常见操作

webdriver中的常见操作有:

方法描述
send_keys()模拟输入指定内容
clear()清除文本内容
is_displayed()判断该元素是否可见
get_attribute()获取标签属性值
size返回元素的尺寸
text返回元素文本

接下来还是用 百度 首页为例,需要用到的就是搜素框和搜索按钮。通过下面的例子就可以了解各个操作的用法了。

# 定位搜索输入框
text_label = driver.find_element_by_xpath('//*[@id="kw"]')

# 在搜索框中输入 自动化测试
text_label.send_keys('自动化测试')

# 清除搜索框中的内容
text_label.clear()

# 输出搜索框元素是否可见
print(text_label.is_displayed())

# 输出placeholder的值
print(text_label.get_attribute('placeholder'))

# 定位搜索按钮
button = driver.find_element_by_xpath('//*[@id="su"]')
# 输出按钮的大小
print(button.size)
# 输出按钮上的文本
print(button.text)

7、鼠标事件

在webdriver 中,鼠标操作都封装在ActionChains类中,常见方法如下:

from selenium.webdriver.common.action_chains import ActionChains

#单击左键
# 定位搜索按钮
text_label = driver.find_element_by_xpath('//*[@id="kw"]')
# 单击左键
text_label.click()

#单击右键,鼠标右击的操作与左击有很大不同,需要使用 ActionChains 
# 定位搜索按钮
button = driver.find_element_by_xpath('//*[@id="kw"]')
# 右键搜索按钮,perform用于执行ActionChains中的操作
ActionChains(driver).context_click(button).perform()

# 双击
# 定位搜索按钮
button = driver.find_element_by_xpath('//*[@id="kw"]')
# 执行双击动作
ActionChains(driver).double_click(button).perform()

# 鼠标悬停
# 定位百度设置
collect  = driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')

# 悬停至设置标签处
ActionChains(driver).move_to_element(collect).perform()

8、键盘操作

webdriver 中 Keys 类几乎提供了键盘上的所有按键方法,我们可以使用 send_keys + Keys 实现输出键盘上的组合按键如 “Ctrl + C”、“Ctrl + V” 等。

from selenium.webdriver.common.keys import Keys

# 定位输入框并输入文本
driver.find_element_by_id('xxx').send_keys('Dream丶killer')

# 模拟回车键进行跳转(输入内容后) 
driver.find_element_by_id('xxx').send_keys(Keys.ENTER)

# 使用 Backspace 来删除一个字符
driver.find_element_by_id('xxx').send_keys(Keys.BACK_SPACE)

# Ctrl + A 全选输入框中内容
driver.find_element_by_id('xxx').send_keys(Keys.CONTROL, 'a')

# Ctrl + C 复制输入框中内容
driver.find_element_by_id('xxx').send_keys(Keys.CONTROL, 'c')

# Ctrl + V 粘贴输入框中内容
driver.find_element_by_id('xxx').send_keys(Keys.CONTROL, 'v')

9、元素等待

显示等待:

设置一个超时时间,每个一段时间就去检测一次该元素是否存在,如果存在则执行后续内容,如果超过最大时间(超时时间)则抛出超时异常(TimeoutException

from selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver
from time import time

# 定位元素
ele = driver.find_element_by_id('xxx')
# 设置显示等待,每0.5秒查找一次元素,超过10秒找不到元素则抛出异常
WebDriverWait(driver, 10, 0.5).until(lambda x: x.find_element(ele),message='找不到该元素')

隐式等待

隐式等待也是指定一个超时时间,如果超出这个时间指定元素还没有被加载出来,就会抛出 NoSuchElementException 异常。

from selenium import webdriver
from time import time

# 设置隐式等待时间为5秒
driver.implicitly_wait(5)
try:
    driver.find_element_by_id('kw')
except Exception as e:
    print(e)

# 代码运行到 driver.find_element_by_id('kw') 这句之后触发隐式等待,在轮询检查 5s 后仍然没有定位到元素,抛出异常

强制等待

使用 time.sleep() 强制等待,设置固定的休眠时间,无论元素有没有加载出来都会等设置的时间结束后执行下一步。

from selenium import webdriver
from time import sleep

# 点击id为‘kw’的元素
driver.find_element_by_id('kw').click()
# 等待5秒再执行下一步
sleep(5)

10、窗口切换

在 selenium 操作页面的时候,可能会因为点击某个链接而跳转到一个新的页面(打开了一个新标签页),这时候 selenium 实际还是处于上一个页面的,需要我们进行切换才能够定位最新页面上的元素。

窗口切换需要使用 switch_to.windows() 方法。

from selenium import webdriver
from time import sleep

# 假设点击这个元素在新标签打开了网页
driver.find_element_by_id('kw').click()

# 获取当前窗口的句柄
ser_1 = driver.window_handles
# 切换到第二个窗口,[0]是当前窗口,[1]是新打开的窗口
driver.switch_to.window(ser_1[1])

# 切换后就可以定位到新窗口的元素并执行操作

三、使用pycharm编写自动化测试脚本

1、配置解释器

        

 

 中文插件安装:设置>plugins>在搜索框输入chinese

2、创建项目

点击文件>新建项目

 3、开始写脚本

新建一个python文件

将上面所讲的基本操作添加进来就可以了 

以上就是本人常用的基本操作,如果在项目中遇到需要其他操作的可以留言或者百度。

​​​​​​​

下一章节内容:pytest单元测试框架

有关Python + Selenium自动化测试的更多相关文章

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

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

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  4. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  5. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  6. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  7. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  8. 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("

  9. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  10. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

随机推荐