这里我们在pageobjects包下新建一个article的包,在article包下新建一个writearticle和allarticle两个包。 在前面基础上,参照TestLogin.java的内容,我在pageobjects下新建一个Login.java的类,内容如下。 ; import org.testng.Assert; import myframework.BrowserEngine; import pageobjects.dashboard.DashBoardPage ; import pageobjects.homepage.HomePage; public class Login { public static WebDriver driver; //第一步,获取浏览器类型 ; import pageobjects.MenuNavigation; import pageobjects.article.writeacticle.NewArticle; public class
2.1代码设计 1.先新建一个pageObjects包,然后在pageObjects包新建一个百度主页类:BaiduHomePage,代码设计如下图所示: 2.再次新建一个testSuites包,然后在 testSuites包下新建一个测试类:TestWithPOM 2.2参考代码 1.BaiduHomePage package pageObjects; import org.openqa.selenium.WebElement import org.openqa.selenium.support.PageFactory; import org.testng.annotations.BeforeClass; import pageObjects.BaiduHomePage
2.1代码设计 1.先新建一个pageObjects包,然后在pageObjects包新建一个百度主页类:BaiduHomePage1,代码设计如下图所示: 2.再次新建一个testSuites包,然后在 testSuites包下新建一个测试类:TestWithPOM1 2.2参考代码 1.BaiduHomePage1 package pageObjects; import java.util.concurrent.TimeUnit org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import pageObjects.BaiduHomePage1
SeleniumHQ PageObject文章 原文链接:https://github.com/SeleniumHQ/selenium/wiki/PageObjects ---- 译文如下: PageObjects 实施说明 PageObjects 可以被认为是同时面向两个方向。面对测试的开发人员,它们代表特定页面提供的服务。 因为我们鼓励测试的开发人员尝试考虑他们正在交互的服务而不是实现,所以 PageObjects 应该很少公开底层 WebDriver 实例。 ")); assertFalse(inbox.isMessageWithSubjectIsUnread("I'm not fond of tofu")); } 当然,与每个指南一样,也有例外,PageObjects 概括 「公共方法代表页面提供的服务」 「尽量不要暴露页面的内部结构」 「一般不做断言」 「方法返回其他 PageObjects」 「不需要代表整个页面」 「相同动作的不同结果被建模为不同的方法」 wx.gif
我们在article包下新建一个ArticleDetailsPage.java package pageobjects.article; import org.openqa.selenium.WebDriver org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import pageobjects.Login ; import pageobjects.MenuNavigation; import pageobjects.article.ArticleDetailsPage; import pageobjects.article.writeacticle.NewArticle
让我们以这个测试为例: import pytest from appium import webdriver from tests.pageobjects.web import LoginPage, ProfilePage 该示例测试在真实iPhone上运行的本机iOS应用程序: import pytest from src.testproject.sdk.drivers import webdriver from tests.pageobjects.android
在pageobjects包下,我新建了2个页面对象:百度新闻首页,百度体育新闻首页,具体文件结构如下图,其他和之前项目层级结构保持不变。 ? 1. import HomePage from automation_framework_demo.pageobjects.baidu_news_home import NewsHomePage from automation_framework_demo.pageobjects.news_sport_home import SportsNewsHomePage class ViewNBANews(unittest.TestCase import HomePage from automation_framework_demo.pageobjects.baidu_news_home import NewsHomePage from automation_framework_demo.pageobjects.news_sport_home import SportsNewsHomePage class ViewNBANews(unittest.TestCase
offers Try not to expose the internals of the page Generally don’t make assertions Methods return other PageObjects the same action are modelled as different methods (摘自:https://github.com/SeleniumHQ/selenium/wiki/PageObjects
Selenium对PageObject的引入 历史简介 2015年,Selenium官方对PageObject进行引入: https://github.com/SeleniumHQ/selenium/wiki/PageObjects 对外只提供对应的方法供调用 Generally don’t make assertions 一般不使用断言 断言要和Page代码分开,不要将断言写在PageObject层 Methods return other PageObjects 方法返回其他PageObjects 例如:首页有个方法是点击登录图标跳转到登录页面,因此这个方法应该返回login_page Need not represent an entire page 不需要表示整个页面
让我们以这个测试为例: import pytest from appium import webdriver from tests.pageobjects.web import LoginPage, ProfilePage 该示例测试在真实iPhone上运行的本机iOS应用程序: import pytest from src.testproject.sdk.drivers import webdriver from tests.pageobjects.android
import * from unittest import TestCase from airtest.core.settings import Settings as ST from TestCases.PageObjects.Android.android_demo 1280)), "计算结果是否等于2") self.android.calc_c() self.android.close_calc() POM文件:TestCases/PageObjects import * from unittest import TestCase from airtest.core.settings import Settings as ST from TestCases.PageObjects.IOS.ios_appium_demo driver.element_value_should_be('结果', 2) self.ios.calc_c() self.ios.close_calc() POM文件:TestCases/PageObjects
# Android测试用例存放目录 │ ├─IOSCase # IOS测试用例存放目录 │ └─PageObjects 测试必须引用此模块 from unittest import TestCase from airtest.core.settings import Settings as ST from TestCases.PageObjects.Web.baidu_demo self.wd.get_title() # airtest断言方法 assert_equal(title, '新闻中心-腾讯网', '对比页面标题') TestCases/PageObjects
分层设计和PageObjects模式。这两个方法,基本解决了笔者遇到的图一中所有的设计类问题。 图三 框架设计建议 按照图三进行分层设计后,得到如图四的测试代码包。 图四 分层后的用例框架 PageObjects模式发源于selenium社区,它的目的是减少重复代码,当开发修改UI时,测试只需在有限的位置修改代码。 如果大家想深入了解PageObjects,请参照如下wiki: https://github.com/SeleniumHQ/selenium/wiki/PageObjects http://blog.csdn.net =解决该问题,也得从PageObjects说起。回到图五中OPTIMIZE_BTN的定义,这个静态变量并未在page中初始化,只有一个@FindBy的注解。
import unittest from selenium import webdriver from PageObjects.login_page import LoginPage from PageObjects.index_page PageObjects调用了PageLocators。 TestCases调用了TestDatas和PageObjects。 写代码的时候特别注意不要出现双向调用。 layui-layer-content"] pass #忘记密码 test_login.py import unittest from selenium import webdriver from PageObjects.login_page import LoginPage from PageObjects.index_page import IndexPage from TestDatas import Common_Datas as
分层设计和PageObjects模式。这两个方法,基本解决了笔者遇到的图一中所有的设计类问题。 ? 图三 框架设计建议 按照图三进行分层设计后,得到如图四的测试代码包。 ? 图四 分层后的用例框架 PageObjects模式发源于selenium社区,它的目的是减少重复代码,当开发修改UI时,测试只需在有限的位置修改代码。 如果大家想深入了解PageObjects,请参照如下wiki: https://github.com/SeleniumHQ/selenium/wiki/PageObjects http://blog.csdn.net 解决该问题,也得从PageObjects说起。回到图五中OPTIMIZE_BTN的定义,这个静态变量并未在page中初始化,只有一个@FindBy的注解。
import datetime import time from Common.dir_config import screenshot_dir class BasePage: # 包含了PageObjects # windows切换 # iframe切换 # select下拉列表 # 上传操作 - PageObjects文件夹下的index_page.py文件 from Common.basepage 点击投标按钮 def click_invest_button(self): self.click_element(loc.bid_button,"首页_点击第一个抢投标按钮") PageObjects
helper:编写您的helper方法 库文件,它可以被不同的组件使用,例如你的fixture在conftest, pageobjects等。 pageobjects: pageobjects设计模式可用于创建不同GUI页面的类。我们在站得住使用Webium,它是Python的一个页面对象模式实现库。
看一下整体的结构 解释: Common:存放公共类 Outputs:存放日志文件、测试报告等 PageLocators:存放页面定位元素 PageObjects:存放页面操作 TestCases
self.driver.find_element_by_xpath("").click() #忘记密码 来自文件test_login.py import unittest from selenium import webdriver from PageObjects.login_page import LoginPage from PageObjects.index_page import IndexPage class TestLogin(unittest.TestCase):
form-error-info"]').text #忘记密码 来自文件test_login.py import unittest from selenium import webdriver from PageObjects.login_page import LoginPage from PageObjects.index_page import IndexPage from TestDatas import Common_Datas as