*#事首发的 driver.switch_to_alert()
那句尽管能够运作通过,不过会弹出警告音讯(那种写法三.x不提出选取)*

Python+Selenium笔记(九):操作警告和弹出框,pythonselenium

(一) 前言

开垦人士使用JavaScript
警告或许模态对话框来提示校验错误音讯、报告警方音讯、实践操作后的回到音讯,以至用来接过输入值等。

(二) Alert类

Selenium WebDriver 通过Alert 类来操控 JavaScript 警告。

(三) Alert效能及措施

功能/属性

简单说明

text

获取弹出窗口的提示信息(文本内容)

alert.text

 

方法

简单说明

accept()

接受JS警告信息,单击确定

dismiss()

接受JS警告信息,单击取消

send_keys(value)

模拟给元素输入信息

 

(四) Webdriver API补充表明(基于笔记七)

方法

简单说明

switch_to_active_element()

返回当前焦点的对象

switch_to_alert()

把焦点切换至当前页面弹出的警告

switch_to_default_content()

切换焦点至默认框架内

switch_to_frame()

通过索引、名称和网页元素,将焦点切换至指定的框架

switch_to_window()

切换焦点到指定的窗口

 

(五) 示范(检查博客园首页点击退出是或不是弹出提醒)

 1 import unittest
 2 from  selenium import webdriver
 3 class SignOut(unittest.TestCase):
 4 
 5     @classmethod
 6     def setUpClass(cls):
 7         #获取自定义的 profile路径
 8         cls.profile = webdriver.FirefoxProfile\
 9             (r'C:\Users\quanhua\AppData\Roaming\Mozilla\Firefox\Profiles\tnwjkr4m.selenium')
10         #创建火狐浏览器驱动实例,启动时加载自定义的profile
11         cls.driver = webdriver.Firefox(cls.profile)
12         cls.driver.implicitly_wait(20)
13         cls.driver.maximize_window()
14         cls.driver.get('https://www.cnblogs.com/')
15     def test_sign_out(self):
16         driver = self.driver
17         #定位博客园首页的 退出
18         span_userinfo = driver.find_element_by_css_selector('#span_userinfo')
19         sign_out_btn = span_userinfo.find_element_by_link_text('退出')
20         sign_out_btn.click()
21         #将焦点切换到当前页面弹出的警告,并获取弹出框的text
22         alert = driver.switch_to_alert()
23         alert_text = alert.text
24         #检查点击退出时,是否弹出提示信息  确认退出吗?
25         self.assertTrue(alert_text == '确认退出吗?')
26         alert.accept() #点击确定
27 
28     @classmethod
29     def tearDownClass(cls):
30         cls.driver.quit()

 

(六) 使用示例代码供给配备火狐的profile(如下图)

要么百度  Python selenium profile

铺排好后,选用自定义的profile张开火狐,登入三次网易(勾选自动登陆),示例代码就能够运维了。

 金沙注册送58 1

 

(壹) 前言 开荒职员使用JavaScript
警告或然模态对话框来唤起校验错误音信、报告警方…

alert 命令弹出2个提醒框

  

* 改成 driver.操作警告和弹出框,JavaScript基础教程之alert弹出提醒框实例。switch_to.alert就不会了。*

为方便对 JavaScript 有一个直观的认知,本节会提供多少个简易的实例供
JavaScript 入门上学之用。上面包车型大巴代码是1个弹出提示框的事例:

利用WebDriver境遇的那些坑

 

金沙注册送58 2

在做web项目标自动化端到端测试时首要使用的是Selenium
WebDriver来驱动浏览器。Selenium
WebDriver的帮助和益处是永葆的言语多,支持的浏览器多。主流的浏览器Chrome、Firefox、IE等都辅助,手提式有线电话机上的浏览器Android、苹果手提式有线电话机等也支撑,乃至还帮衬PhantomJS(由于PhantomJS跑测试时并不要求渲染元素,所以举办进度快)。

然则自个儿在行使Selenium
WebDriver时,遭逢了无数坑。那个主题材料,有的是因为Selenium
WebDriver与浏览器差异版本之间包容性的主题素材,有的是Selenium
WebDriver自己的bug,当然也不乏友好对Selenium
WebDriver好几职能掌握不彻底。笔者花时间总结了一下,分享给大家,希望大家以后碰着难点得以避过这个坑,少走弯路。其它也总括了有个别运用WebDriver的相比好的实行,也壹并分享给我们。

  • WebDriver每趟运转一个Firefox的实例时,会扭转3个无名氏的profile,并不会选用当前Firefox的profile。那点一定要专注。例如借使访问被测试的web服务需求经过代理,你想直接设置Firefox的代理是低效的,因为WebDriver运营的Firefox实例并不会动用你这一个profile,准确的做法是经过FirefoxProfile来安装。
1
2
3
4
5
6
7
8
9
10
11
public WebDriver create() {
  FirefoxProfile firefoxProfile = new FirefoxProfile();
  firefoxProfile.setPreference("network.proxy.type",1);
  firefoxProfile.setPreference("network.proxy.http",yourProxy);
  firefoxProfile.setPreference("network.proxy.http_port",yourPort);
  firefoxProfile.setPreference("network.proxy.no_proxies_on","");
  return new FirefoxDriver(firefoxProfile);
}

通过FirefoProfile也能够安装Firefox其余各样配置。假设要默许给Firefox安装插件的话,能够将插件放置到Firefox安装目录下的私下认可的plugin文件夹中,那样尽管是接纳一个全新的profile也足以行使此plugin。

  • 利用WebDriver点击分界面上Button成分时,就算当前Button元素被分界面上别的因素遮住了,或没出未来分界面中(比如Button在页面尾巴部分,可是显示屏只可以显示页面上半某些),使用暗中同意的WebElement.Click()或然会接触不了Click事件。

改进方案是找到该页面成分后一向发送一条Click的JavaScript指令。

1
((JavascriptExecutor)webDriver).executeScript("arguments[0].click();", webElement);
  • 当举行了有个别操作产生页面跳转时,最佳加一个Wait方法等待page
    load完成再拓展持续操作。方法是在某些时间段内决断document.readyState是否complete。
1
2
3
4
5
6
7
8
9
10
11
12
13
    protected Function<WebDriver, Boolean> isPageLoaded() {
        return new Function<WebDriver, Boolean>() {
            @Override
            public Boolean apply(WebDriver driver) {
                return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
            }
        };
    }
    public void waitForPageLoad() {
        WebDriverWait wait = new WebDriverWait(webDriver, 30);
        wait.until(isPageLoaded());
    }
  • 1经页面有Ajax操作,需求写2个Wait方法等待Ajax操作实现。情势与上一条中的基本一样。比方四个Ajax操作是用于向DropDownList中填充数据,则写四个办法决断该DropDownList申月素是或不是多余0个。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    private Function<WebDriver, Boolean> haveMoreThanOneOption(final By element) {
        return new Function<WebDriver, Boolean>() {
            @Override
            public Boolean apply(WebDriver driver) {
                WebElement webElement = driver.findElement(element);
                if (webElement == null) {
                    return false;
                } else {
                    int size = webElement.findElements(By.tagName("option")).size();
                    return size >= 1;
                }
            }
        };
    }
    public void waitForDropDownListLoaded() {
        WebDriverWait wait = new WebDriverWait(webDriver, 30);
        wait.until(isPageLoaded());
    }

依此类推,大家得以看清某个成分是或不是呈现、某些class是或不是append成功等1密密麻麻措施来推断ajax是还是不是实行到位。

  • 若果网址接纳了JQuery的卡通片效果,我们在运转测试的时候实在可以disable
    JQuery的animation,壹方面能够加速测试的速度,另一方面可以抓牢地度量试的乐不可支(若是启用了Animation,使用WebDriver驱动浏览器时恐怕会冒出有的不能预想的13分)。
1
((JavascriptExecutor)driver).executeScript("jQuery.fx.off=true");
  • 是因为WebDriver要驱动浏览器,所以测试运转的年华相比较长,大家可以相互跑测试以节省时间。假如您选拔的是maven构建筑工程具,可以配备surefire
    plugin时,在configruation节点到场以下配置。
1
2
3
<parallel>classes</parallel>
<threadCount>3</threadCount>
<perCoreThreadCount>false</perCoreThreadCount>
  • 当测试fail的时候,假若当前选拔的WebDriver达成了TakesScreenshot接口,我们就足以调用相应的主意截下当前浏览器显示的web页面,那样有利于火速牢固出错的因由。
1
2
3
4
5
6
    public void getScreenShot() {
        if (webDriver instanceof TakesScreenshot) {
            TakesScreenshot screenshotTaker = (TakesScreenshot) webDriver;
            File file = screenshotTaker.getScreenshotAs(savePath);
        }
    }
  • 即使页面弹出了浏览器自带的警告框(使用JavaScript的Alert方法),Selenium
    WebDriver在点选次警告框时会偶尔退步。具体原因还未查明。化解方案是竭尽不利用Alert方法的警示框,而是本人完成情势窗口(举个例子Jquery
    UI的情势窗口)来完毕警告框效果。那样即确认保证了测试的牢固性,其余我们和好能够调控警告框的样式,给用户带来更加好的心得。

  • 时常更新Selenium的本子。注意日常上Selenium的官网看是还是不是公布了新的版本,新的版本都修复了那2个bug,尽管含有你碰到的bug,就能够提高到最近的本子。

四、获得文本框里的文字

 

  1. assertEquals(selenium.getValue("xpath=//input[@name=’WNO’]"), "1");

 

  getValue 方法正是赢得文本框里的数值,可不是 getText
方法,用错了可就郁闷了。

  五、推断页面是还是不是留存二个要素

 

  1. assertTrue(selenium.isElementPresent("xpath=//input[@name=’MEICK_000′]"));

 

  一般那么些是用来测试当删除一些数据后,页面上稍加东西就不会彰显的动静。

  6、判断下拉框里挑选了哪个选项

 

  1. assertEquals(selenium.getSelectedIndex("xpath=//SELECT[@name=’HATIMING’]"), "1");

 

  那一个能够用来推断下拉框突显的精选是还是不是是期望的选项。

  7、假诺有 alert 弹出对话框如何做?

  这些主题材料弄了挺长期,能够这么来关闭弹出的对跨框:

 

  1. if(selenium.isAlertPresent()) {

  2.

  3.    selenium.getAlert();

  4.

  5. }

 

  其实当调用 selenium.getAlert() 时,就会破产 alert 弹出的对话框。

  也得以动用 System.out.println(selenium.getAlert())
来查看对跨框展现的消息。

  在测试的时候,有的人会显示诸多alert
来查看运营时的多少,那么大家得以用下边包车型客车主意来关闭那么些 alert:

 

  1. while(selenium.isAlertPresent()) {

  2.

  3.    selenium.getAlert();

  4.

  5. }

 

  八、如何测试一些漏洞非常多音讯的突显?

 

  1. assertTrue(selenium.getBodyText().indexOf("错误消息")>=0);

 

  切记: getBodyText 重返的时浏览器页面上的文字,不回包罗html
代码的,假使要呈现html 代码,用上边那几个:

 

  1. System.out.println(selenium.getHtmlSource());

 

  以上正是最常用的多少个章程了,举个例子 click, type, getValue 等等。

  还有正是必然要学习 xpath, 其实xpath 也得以有“与、或、非”的操作:

 

  1. selenium.check("xpath=//input[(@name=’KNYKBN’)and(@value=’Y’)]");

 

  四、其他

  selenium
还有越来越多的用法,比如弹出页面等等。当面对没见过的测试供给时,小编最笨的情势正是遵守api文书档案3个一个找,

(一) 前言

复制代码 代码如下:

开采人士使用JavaScript
警告只怕模态对话框来唤起校验错误音讯、报告警察方音信、推行操作后的归来音信,乃至用来接收输入值等。

<script type=”text/javascript”>
alert(“小编是提示文字!”);
</script>

(二) Alert类

将下边部分代码,用文件编辑器(如写字板或任何更加高端的编辑器,如 艾德itPlus
等)保存为 alert.html(或 alert.htm)。双击 alert.html
运维它(实际是利用 IE 等浏览器张开这几个文件),会看到如下弹出提醒框:

Selenium WebDriver 通过Alert 类来操控 JavaScript 警告。

金沙注册送58 3

(三) Alert功用及办法

提示

功能/属性

简单说明

text

获取弹出窗口的提示信息(文本内容)

alert.text

假设采用 IE 浏览器提醒:为了方便维护安全性,Internet Explorer
已经限制此网页运转能够访问Computer的本子或 ActiveX
空间。”,那么请选拔“允许阻止的始末”,以允许IE浏览器运行方面的 JavaScript
代码。

 

实例语法解释

方法

简单说明

accept()

接受JS警告信息,单击确定

dismiss()

接受JS警告信息,单击取消

send_keys(value)

模拟给元素输入信息

上面对上面例子的 JavaScript 语法做贰个粗略的解释:
<script type=”text/javascript”>代表 JavaScript
代码的始发,</script> 代表截至。JavaScript
代码要放在这些初阶与截止之间。
alert(“小编是提示文字!”); 就是 JavaScript 代码,alert()
表示弹出一个提醒框(如上图所示),代码以英文的 ; 表示甘休。
弹出框的唤起文字,以 “” 或 ” 引起来,并放入 alert() 中。

 

你只怕感兴趣的稿子:

  • 修改js confirm alert
    提醒框文字的回顾实例
  • JS达成alert中突显换行的不二秘诀
  • JavaScript中的alert()函数使用技能详解
  • 明确命令禁止iframe页面的有所js脚本如alert及弹出窗口等
  • 让JavaScript的Alert弹出框失效的章程禁止弹出警告框
  • js重写alert控件(适合学习js的新手朋友)
  • js的alert样式怎么着转移如背景颜色
  • 利用JavaScript实现alert的实例代码

(四) Webdriver API补充表达(基于笔记七)

方法

简单说明

switch_to_active_element()

返回当前焦点的对象

switch_to_alert()

把焦点切换至当前页面弹出的警告

switch_to_default_content()

切换焦点至默认框架内

switch_to_frame()

通过索引、名称和网页元素,将焦点切换至指定的框架

switch_to_window()

切换焦点到指定的窗口

 

(五) 以身作则(检查网易首页点击退出是还是不是弹出提醒)

 1 import unittest
 2 from  selenium import webdriver
 3 class SignOut(unittest.TestCase):
 4 
 5     @classmethod
 6     def setUpClass(cls):
 7         #获取自定义的 profile路径
 8         cls.profile = webdriver.FirefoxProfile\
 9             (r'C:\Users\quanhua\AppData\Roaming\Mozilla\Firefox\Profiles\tnwjkr4m.selenium')
10         #创建火狐浏览器驱动实例,启动时加载自定义的profile
11         cls.driver = webdriver.Firefox(cls.profile)
12         cls.driver.implicitly_wait(20)
13         cls.driver.maximize_window()
14         cls.driver.get('https://www.cnblogs.com/')
15     def test_sign_out(self):
16         driver = self.driver
17         #定位博客园首页的 退出
18         span_userinfo = driver.find_element_by_css_selector('#span_userinfo')
19         sign_out_btn = span_userinfo.find_element_by_link_text('退出')
20         sign_out_btn.click()
21         #将焦点切换到当前页面弹出的警告,并获取弹出框的text
22         alert = driver.switch_to_alert()
23         alert_text = alert.text
24         #检查点击退出时,是否弹出提示信息  确认退出吗?
25         self.assertTrue(alert_text == '确认退出吗?')
26         alert.accept() #点击确定
27 
28     @classmethod
29     def tearDownClass(cls):
30         cls.driver.quit()

 

(六) 行使示例代码需求配置火狐的profile(如下图)

金沙注册送58 ,抑或百度  Python selenium profile

安顿好后,选拔自定义的profile张开火狐,登6三回天涯论坛(勾选自动登6),示例代码就能够运作了。

 金沙注册送58 4

 

相关文章

网站地图xml地图