针对集成和selenium测试后回滚数据库这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展.net–集成(Selenium)测试后回滚数据库、c#–是否可以在不安装SeleniumServe
针对集成和selenium测试后回滚数据库这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展.net – 集成(Selenium)测试后回滚数据库、c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?、IPS屏是否对selenium定位有影响?(selenium+IE)、Python-爬虫-动态渲染页面抓取-(Selenium)的使用等相关知识,希望可以帮助到你。
本文目录一览:- 集成(selenium)测试后回滚数据库(selenium回归测试)
- .net – 集成(Selenium)测试后回滚数据库
- c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?
- IPS屏是否对selenium定位有影响?(selenium+IE)
- Python-爬虫-动态渲染页面抓取-(Selenium)的使用
集成(selenium)测试后回滚数据库(selenium回归测试)
是否有人对从集成测试框架(如Selenium)进行的回滚数据库事务的最佳实践或首选方式有任何建议?
这是当前的情况:我们有一个.net Web项目,其中包含许多在单元测试环境中可以正常工作的单元测试-
每个测试都继承一个父类,该父类在[SetUp]中打开一个事务,并在其中回滚该事务。 [TearDown]。每次测试后,我们的单元测试数据库都恢复到原始状态。
但是,一旦进入集成环境,情况就会改变。我们的持续集成服务器会自动编译我们的提交并将其提交到测试服务器,以便该服务器始终以最新的代码运行。我们还设置了一个Selenium实例来自动化用户与站点的交互。selenium测试基本上与现有的Selenium服务器通信,并告诉服务器诸如“启动浏览器并转到http://testsite/TestPage.aspx-在id为’def’的表单字段中输入文本’
abc’-断言新页面包含文字“ xyz””
每个测试的运行方式都与我们的原始单元测试类似,但是有一个重要的例外:Selenium所做的任何更改都是在完全不同的线程/应用程序中完成的,因此我们不能(我想,我们不能,至少)在测试拆解中将它们回滚。
我们还没有找到一个很好的解决方案。现在,我们正在使用SqlCommand执行sql语句来备份数据库,然后在测试结束时,将数据库设置为单用户,删除当前的db,然后还原旧副本-
这不是理想的副本,因为这样会有效地杀死附加到数据库的应用程序,并要求我们再次重新初始化该应用程序。
这是以前已经解决的问题吗?任何建议都很棒。
谢谢!
答案1
小编典典每次测试之前,我们正在运行一个drop / create-table脚本。这非常快,可以确保以前的测试没有遗留任何内容。
PS:我们正在使用NHibernate,它可以动态创建此脚本并在内存中的Sqlite上运行测试,这是光速。但是,如果我们切换到SqlServer,它仍然非常快。
.net – 集成(Selenium)测试后回滚数据库
这是我们目前的情况:我们有一个.net web项目,其中包含许多单元测试,它们在我们的单元测试环境中运行良好 – 每个测试都继承了一个在[SetUp]中打开事务的父类,并回滚了事务. [TearDown].每次测试后,我们的单元测试数据库都会恢复到原始状态.
但是,一旦我们进入集成环境,事情就会发生变化.我们的持续集成服务器自动编译我们的提交并将它们推送到测试服务器,以便服务器始终运行在最新的代码上.我们还设置了一个Selenium实例来自动化用户与站点的交互. selenium测试基本上与现有的Selenium服务器通信,并告诉服务器诸如“启动浏览器并转到http://testsite/TestPage.aspx – 在id’def’的表单字段中输入文本’abc’ – 断言新页面包含文本’xyz’”
每个测试都以与我们的vanilla单元测试类似的方式运行,但有一个重要的例外:Selenium所做的任何更改都是在完全不同的线程/应用程序中完成的,因此我们不能(我认为我们不能,至少)在测试拆解时将它们卷回来.
我们还没有找到一个很好的解决方案.现在我们正处于使用sqlCommand执行sql语句来备份数据库的时刻,然后在测试结束时,我们将数据库设置为单个用户,删除当前数据库并恢复旧副本 – 这不太理想,因为它有效地杀死了附加到数据库的应用程序,并要求我们再次重新初始化应用程序.
这是一个以前解决过的问题吗?任何建议都很棒.
谢谢!
解决方法
PS:我们正在使用NHibernate,它可以动态创建这个脚本并在内存中对sqlite运行测试,它是光速的.但是,如果我们切换到sqlServer,它仍然非常快.
c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?
这是DefaultSelenium的构造函数:
ISelenium sele = new DefaultSelenium(**serveraddr**,**serverport**,browser,url2test); sele.Start(); sele.open(); ...
似乎我必须在创建ISelenium对象之前安装Selenium Server.
我的情况是,我正在尝试使用C#Selenium构建一个.exe应用程序,它可以在不同的PC上运行,并且不可能在所有PC上安装Selenium Server(你永远不知道哪个是下一个运行应用程序).
有没有人知道如何在不安装服务器的情况下使用ISelenium / DefaultSelenium?
谢谢!
解决方法
1)对于selenium浏览器启动:
DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setbrowserName("safari"); CommandExecutor executor = new SeleneseCommandExecutor(new URL("http://localhost:4444/"),new URL("http://www.google.com/"),capabilities); WebDriver driver = new RemoteWebDriver(executor,capabilities);
2)对于selenium命令:
// You may use any WebDriver implementation. Firefox is used here as an example WebDriver driver = new FirefoxDriver(); // A "base url",used by selenium to resolve relative URLs String baseUrl = "http://www.google.com"; // Create the Selenium implementation Selenium selenium = new WebDriverBackedSelenium(driver,baseUrl); // Perform actions with selenium selenium.open("http://www.google.com"); selenium.type("name=q","cheese"); selenium.click("name=btnG"); // Get the underlying WebDriver implementation back. This will refer to the // same WebDriver instance as the "driver" variable above. WebDriver driverInstance = ((WebDriverBackedSelenium) selenium).getWrappedDriver(); //Finally,close the browser. Call stop on the WebDriverBackedSelenium instance //instead of calling driver.quit(). Otherwise,the JVM will continue running after //the browser has been closed. selenium.stop();
描述于此:http://seleniumhq.org/docs/03_webdriver.html
谷歌在C#中有类似的东西.没有其他方法可以实现这一目标.
IPS屏是否对selenium定位有影响?(selenium+IE)
LCD屏上的代码,放到配有IPS屏的电脑上,大部分页面无法定位。
若降低屏幕分辨率或将电脑显示设置中“更改文本、应用和其他项目的大小”设置为100%,能够改善部分元素定位,但还有一部分元素无法定位。
小白求解
Python-爬虫-动态渲染页面抓取-(Selenium)的使用
Ajax形式的请求时JS动态渲染的一种手段,我们可以通过requests和urllib库来实现页面数据抓取,但是js动态渲染页面不仅仅是AJAX一种形式,
有的网页是由JS直接生成的,并非原始HTML,可能还不包含AJAX请求;例如一些报表工具ECharts 官网的实例,图形都是通过JS生成的;例如淘宝页面,即使是AJAX请求数据,但是接口中包含了很多加密参数,我们很难以找到规则,也因此很难分析AJAX请求来抓取数据;
为了解决以上问题,我们可以直接通过使用模拟浏览器运行的方式实现,那么就可以实现原本浏览器中可以看到的,抓取的数据就是什么样,即所见即所"得"(爬);此时我们不用再去关心网页中JS使用了什么算法或者结构实现了页面渲染,不用关心网页后台的AJAX接口到底有哪些参数;
Python提供了好多模拟浏览器运行的库,例如:Seleium,Splash,PyV8,Ghost等;
Selenium的使用
Selenium是一个自动化测试工具,可以按照指定的命令自动操作;
安装: pip install selenium
官网:http://www.seleniumhq.org
中文文档:http://selenium-python-zh.readthedocs.io
由于Selenium需要启动浏览器,因此需要安装不同浏览器的驱动;
1.chromedriver 下载地址:https://code.google.com/p/chromedriver/downloads/list
2.Firefox的驱动geckodriver 下载地址:https://github.com/mozilla/geckodriver/releases/
3.IE的驱动IEdriver 下载地址:http://www.nuget.org/packages/Selenium.WebDriver.IEDriver/
例如火狐浏览器如下安装方式:
下载解压后,将chromedriver.exe , geckodriver.exe , Iedriver.exe发到Python的安装目录,例如 D:\python 。这里我们只用了火狐浏览器为例,
则将 geckodriver.exe 放入python根目录;然后再将Python的安装目录添加到系统环境变量的Path下即可;
这里我放在了:D:\Programs\Python\Python37\Scripts目录,且之前已经在Path下设置了该目录的环境变量;
测试是否安装成功,如果执行后打开一个对应浏览器的空白页,则表示安装成功;
火狐浏览器启动:
1 from selenium import webdriver
2 browser = webdriver. Firefox()
谷歌浏览器启动:
1 from selenium import webdriver
2
3 browser = webdriver.Chrome()
IE浏览器启动:
1 from selenium import webdriver
2
3 browser = webdriver.Ie()
注:此方法有不便之处,即在程序运行过程中需要一直开着浏览器,在爬取网页过程中浏览器可能一直开启,目前Chrome浏览器版本已经支持无界面模式了,如果版本比较旧此时就不会支持无界面模式;
还有另一种方式,即安装一个无界面浏览器PhantomJS,此时抓取过程都会在后台运行,不会再弹出浏览器窗口了;
1.浏览器对象声明:
Selenium支持非常多的浏览器,例如Chrome、Firefox、Edge等,还有Android,BlackBerry等手机端的浏览器;也支持无界面的PhantomJS;
例如:
from selenium import webdriver
browser = webdri ver. Chrome()
browser = webdriver. Firefox()
browser = webdri ver. Edge()
browser = webdriver. PhantomJS()
browser= webdriver.Safari()
2.浏览器对象访问资源
可以通过get()方法请求页面,参数传入连接URL即可;
1 from selenium import webdriver
2 browser = webdriver. Firefox()
3 browser.get(''https://www.baidu.com'')
4 print(browser.page_source)
5 browser.close()
3、查找节点
Selenium可以驱动浏览器完成各种操作,例如:填充表单,模拟单击事件等;
比如我们想通过程序添加表单数据,需要知道保单在那个位置;但是Selenium提供了一系列查找节点的方法,我们可以利用这些方法获取节点,做下一步执行动作和信息抓取做准备;
例如:
1 from selenium import webdriver
2 browser = webdriver. Firefox()
3 browser.get(''https://www.baidu.com'')
4 input_1=browser.find_element_by_id(''kw'')#百度输入框的id为kw
5 input_2=browser.find_element_by_css_selector(''#kw'')#按照css选择器选择对象
6 input_3=browser.find_element_by_xpath(''//*[@id="kw"]'')#按照xml path选择元素
7
8
9 print(input_1)
10 print(input_2)
11 print(input_3)
12 browser.close()
find_element()方法:
该方法有两个参数,表示查找方式by和值;即:find_element_by_id(''id值'') 等价find_element(By.ID,''id值'')
是一种通用的查找方法;
find_elements()方法:
该方法用于多个节点的查找,比上面方法多了个s字母,
例如:
browser.find_elements_by_class_name
browser.find_element_by_class_name
两个方法,一个带s一个不带,则前者是查找多个节点,后者只找一个节点;
1 news_menus1=browser.find_elements(By.CSS_SELECTOR,''.mnav'')
2 news_menus2=browser.find_elements(By.CLASS_NAME,''mnav'')
4、节点交互
Selenium 可以驱动浏览器来执行一些动作,即让浏览器模拟执行一些动作;常见用法:
输入文字时用send_keys()方法,清空文字则使用clear()方法,点击按钮则click()方法;
例如:先输入Python关键词,然后清空,在输入JAVA,点击按钮访问;此时为了看到更好效果,则加入休眠5秒;
1 from selenium import webdriver
2 import time
3 from selenium.webdriver.common.by import By
4 browser = webdriver. Firefox()
5 browser.get(''https://www.baidu.com'')
6 input_1=browser.find_element_by_id(''kw'')#百度输入框的id为kw
7 input_1.send_keys(''Python'')
8 time.sleep(5)
9 input_1.clear()
10 input_1.send_keys(''JAVA'')
11 time.sleep(5)
12 suBtn=browser.find_element_by_id(''su'')
13 suBtn.click()
14
15 browser.close()
5、动作链
上面实例是通过点击触发的事件,例如鼠标拖拽,键盘按键灯,这些动作需要通过另一种方式执行,即所谓的动作链;
鼠标事件:
事件
描述
context_click()
鼠标右击
double_click()
鼠标双击
drag_and_drop(source,target)
拖动
move_to_element()
光标悬停
move_to
移动
键盘事件:
事件
描述
send_keys(Keys.BACK_SPACE)
删除按键
send_keys(Keys.SPACE)
空格键
send_keys(Keys.TAB)
Tab键
send_keys(Keys.ESCAPE)
ESC键
send_keys(Keys.ENTER)
回车键
send_keys(Keys.CONTROL,''a'')
A
send_keys(Keys.CONTROL,''c'')
C
send_keys(Keys.CONTROL,''x'')
X
send_keys(Keys.CONTROL,''v'')
V
...
...
send_keys(Keys.F1)
F1
send_keys(Keys.F5)
F5
send_keys(Keys.F12)
F12
...
...
例如:
今天关于集成和selenium测试后回滚数据库的分享就到这里,希望大家有所收获,若想了解更多关于.net – 集成(Selenium)测试后回滚数据库、c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?、IPS屏是否对selenium定位有影响?(selenium+IE)、Python-爬虫-动态渲染页面抓取-(Selenium)的使用等相关知识,可以在本站进行查询。
本文标签: