diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..3c8a0a2 --- /dev/null +++ b/pom.xml @@ -0,0 +1,136 @@ + + + 4.0.0 + + com.essatest + essa + 1.0-SNAPSHOT + jar + + essa + http://maven.apache.org + + + UTF-8 + + + + + + org.testng + testng + 6.14.3 + + + + + org.seleniumhq.selenium + selenium-java + 3.11.0 + + + + + org.seleniumhq.selenium + selenium-firefox-driver + 3.11.0 + + + + org.seleniumhq.selenium + selenium-chrome-driver + 3.11.0 + + + + org.seleniumhq.selenium + selenium-safari-driver + 3.11.0 + + + + org.seleniumhq.selenium + selenium-ie-driver + 3.11.0 + + + + + org.seleniumhq.selenium + selenium-support + 2.46.0 + + + + javax.mail + mail + 1.4 + + + + org.apache.commons + commons-collections4 + 4.1 + + + + org.apache.poi + poi + 3.14 + + + + org.apache.poi + poi-ooxml + 3.14 + + + + org.apache.poi + poi-ooxml-schemas + 3.14 + + + + org.apache.commons + commons-io + 1.3.2 + + + + mysql + mysql-connector-java + 6.0.6 + + + org.dbunit + dbunit + 2.5.4 + + + jdom + jdom + 1.0 + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.7.1 + + + + resources/suites/testng.xml + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/buyer/pageObject/AssetManagementPage.java b/src/main/java/com/buyer/pageObject/AssetManagementPage.java new file mode 100644 index 0000000..883c8b5 --- /dev/null +++ b/src/main/java/com/buyer/pageObject/AssetManagementPage.java @@ -0,0 +1,11 @@ +package com.buyer.pageObject; + +import org.openqa.selenium.WebDriver; + +import com.essa.framework.BasePage; + +public class AssetManagementPage extends BasePage { + public AssetManagementPage(WebDriver driver) { + super(driver); + } +} diff --git a/src/main/java/com/buyer/pageObject/BuyerLoginPage.java b/src/main/java/com/buyer/pageObject/BuyerLoginPage.java new file mode 100644 index 0000000..d69e77b --- /dev/null +++ b/src/main/java/com/buyer/pageObject/BuyerLoginPage.java @@ -0,0 +1,48 @@ +package com.buyer.pageObject; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; + +/** + * 采购商登录页 + * @author Administrator + * + */ +public class BuyerLoginPage extends BasePage { + public BuyerLoginPage(WebDriver driver) { + super(driver); + } + /* + * 页面元素定位 + */ + //用户名:邮箱 + @FindBy (xpath = "//*[@id='username']") + WebElement userName; + + //密码 + @FindBy (xpath = "//*[@id='password']") + WebElement passWord; + + //登录按钮 + @FindBy (xpath = "//*[@id='login']") + WebElement signIn; + + /* + * 页面方法 + */ + /** + * 采购商登录方法 + * @param account 账号 + * @param password 密码 + * @return IndexPage + */ + public IndexPage login(String account,String password) { + sendKeys(userName, account); + sendKeys(passWord, password); + click(signIn); + return new IndexPage(driver); + } +} diff --git a/src/main/java/com/buyer/pageObject/ConslidationPage.java b/src/main/java/com/buyer/pageObject/ConslidationPage.java new file mode 100644 index 0000000..86827fc --- /dev/null +++ b/src/main/java/com/buyer/pageObject/ConslidationPage.java @@ -0,0 +1,97 @@ +package com.buyer.pageObject; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; +import com.essa.framework.Model; + +/** + * 暂存柜,拼柜页面 + * @author Administrator + * + */ +public class ConslidationPage extends BasePage { + public ConslidationPage(WebDriver driver) { + super(driver); + } + /* + * 元素定位 + */ + //关闭提示 + @FindBy(xpath="//*[@class='close']") + WebElement close; + + //选择散货 + @FindBy (xpath ="//button[text()='Bulk cargo']") + WebElement bulkCargo; + + //确认 + @FindBy (xpath="//button[text()='OK']") + WebElement ok; + + //查询输入框 + @FindBy (xpath="//*[@id='left-search']/div/input") + WebElement searchText; + + //查询按钮 + @FindBy (xpath="//*[@id='left-search']/div/span") + WebElement search; + + //左边列表第一个复选框 + @FindBy (xpath="//*[@id='left-product-list']/div[1]/div/div[2]/div/ul/li[1]/input") + WebElement leftFirstCheckbox; + + //中间加入右边的箭头 + @FindBy (xpath="//*[@id='icon-pi-right-big']") + WebElement add; + + //右边的第一个复选框 + @FindBy (xpath="//*[@id='right-product-list']/div/div/div[2]/div/ul/li[1]/input") + WebElement rightFirstCheckbox; + + //下一步,设置贴纸 + @FindBy (xpath="//*[@id='next']") + WebElement next; + + //确认弹框-可能会提示价格不一致 + @FindBy (xpath ="//a[text()='OK']") + WebElement ok2; + + /** + * 开始拼柜 + * @return SettingMarkerPage + */ + public SettingMarksPage conslidation() { + //是否有操作提示弹框 + if(isVisibility(By.xpath("//*[@class='close']"))) { + click(close); + } + forceWait(1000); + //是否有选择货柜 + if(isVisibility(By.xpath("//button[text()='Bulk cargo']"))) { + click(bulkCargo); + click(ok); + forceWait(1000); + } + sendKeys(searchText, Model.getSkuNo()); + click(search); + click(leftFirstCheckbox); + click(add); + //是否有加入到暂存柜 + dynamicWait(By.xpath("//*[@id='right-product-list']/div/div/div[2]/div/ul/li[1]/input")); + forceWait(2000); + moveHeightScroll("100"); + forceWait(1000); + click(next); + //如果提示价格变化,确认弹框 + if(isVisibility(By.xpath("//a[text()='OK']"))) { + click(ok2); + forceWait(1000); + click(next); + } + return new SettingMarksPage(driver); + } +} diff --git a/src/main/java/com/buyer/pageObject/IndexPage.java b/src/main/java/com/buyer/pageObject/IndexPage.java new file mode 100644 index 0000000..4161e69 --- /dev/null +++ b/src/main/java/com/buyer/pageObject/IndexPage.java @@ -0,0 +1,131 @@ +package com.buyer.pageObject; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; +import com.essa.framework.Model; + +/** + * 采购商首页 + * @author Administrator + * + */ +public class IndexPage extends BasePage { + public IndexPage(WebDriver driver) { + super(driver); + } + /* + * 元素定位 + */ + //登录-sign in + @FindBy (xpath ="//*[@id='SignIn']/a") + WebElement signIn; + + //注册-register + @FindBy (xpath ="//*[@class='u-login']/a") + WebElement register; + + //关键字输入框 + @FindBy (xpath ="//*[@class='search-tx']/input") + WebElement searchText; + + //查询按钮 + @FindBy (xpath ="//*[@class='btn btn-primary search-btn']") + WebElement searchButton; + + //绑定手机弹窗-关闭按钮 + @FindBy (xpath ="//*[contains(@class,'layui-layer-close1')]") + WebElement closed; + + //右上角购物车 + @FindBy (xpath ="//*[@id='miniCart']") + WebElement minicart; + + /* + * 页面方法 + */ + /** + * 进入登录页面 + * @return BuyerLoginPage + */ + public BuyerLoginPage toLoginPage() { + click(signIn); + return new BuyerLoginPage(driver); + } + + /** + * 进入注册页面 + * @return RegisterPage + */ + public RegisterPage toRegisterPage() { + click(register); + return new RegisterPage(driver); + } + + /** + * 进入购物车 + * @return ShoppingCartPage + */ + public ShoppingCartPage toShoppingCartPage() { + if (isVisibility(By.xpath("//*[@id='bind-phone']"))) { + forceWait(1000); + click(closed); + } + click(minicart); + return new ShoppingCartPage(driver); + } + /** + * 关键字搜索商品 + * @return KeywordResultPage + */ + public KeywordResultPage keywordSearch() { + //判断是否绑定手机 + if (isVisibility(By.xpath("//*[@id='bind-phone']"))) { + click(closed); + } + //如果是非活动 +// if (Model.getIsactivity()==0 &&(Model.getSkuNo().equals("选填,勿填活动商品")||Model.getSkuNo().equals(""))) { + if (Model.getIsactivity()==0 &&(("选填,勿填活动商品").equals(Model.getSkuNo())||("").equals(Model.getSkuNo()))) { + //判断是否自定义输入商品编号 + String sql = "SELECT s.id,s.`no` from prd_category c\r\n" + + "LEFT JOIN prd_goods g on c.id = g.category_id\r\n" + + "LEFT JOIN prd_goods_sku s on s.goods_id = g.id\r\n" + + "where find_in_set(5,REPLACE(c.path,'.',','))\r\n" + + "AND s.`no` > 200000000\r\n" + + "AND s.id NOT IN (SELECT g.sku_id FROM sale_group_buy g)\r\n" + + "AND s.id NOT IN (SELECT t.sku_id FROM sale_shopping_cart t)\r\n" + + "AND s.src = 1\r\n" + + "AND s.`status` = 2\r\n" + + "AND s.is_stop_product = 0\r\n" + + "AND s.is_delete = 0\r\n" + + "limit 1"; + Model.setSkuNo(DBSqlSearch(sql, "no")); + }else if (Model.getIsactivity()==1 &&(("选填,勿填非活动商品").equals(Model.getSkuNo())||("").equals(Model.getSkuNo()))) { + //活动商品 + String sql = "SELECT s.id,s.`no` from prd_category c\r\n" + + "LEFT JOIN prd_goods g on c.id = g.category_id\r\n" + + "LEFT JOIN prd_goods_sku s on s.goods_id = g.id\r\n" + + "LEFT JOIN sale_group_buy a on a.sku_id = s.id\r\n" + + "where s.`no` > 200000000\r\n" + + "AND s.id NOT IN (SELECT t.sku_id FROM sale_shopping_cart t)\r\n" + + "AND a.`status` = 20 and s.src = 1 \r\n" + + "limit 1;"; + Model.setSkuNo(DBSqlSearch(sql, "no")); + } +// System.out.println(Model.getSkuNo()); + sendKeys(searchText, Model.getSkuNo()); + click(searchButton); + return new KeywordResultPage(driver); + } + + /** + * 断言是否注册成功,根据是否有绑定手机号的弹窗来判断 + * @return boolean + */ + public boolean isSucceed() { + return isVisibility(By.xpath("//*[contains(@class,'layui-layer-close1')]")); + } +} diff --git a/src/main/java/com/buyer/pageObject/KeywordResultPage.java b/src/main/java/com/buyer/pageObject/KeywordResultPage.java new file mode 100644 index 0000000..d5fc48f --- /dev/null +++ b/src/main/java/com/buyer/pageObject/KeywordResultPage.java @@ -0,0 +1,116 @@ +package com.buyer.pageObject; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; +import com.essa.framework.Model; + +/** + * 关键字查询结果页 + * @author Administrator + * + */ +public class KeywordResultPage extends BasePage { + public KeywordResultPage(WebDriver driver) { + super(driver); + } + /* + * 元素定位 + */ + //加入购物车 + @FindBy (xpath ="//*[@id='product-list']/ul[1]/div[1]/li[1]/div[1]/div[1]/div[4]/div[2]") + WebElement addToCart; + + //确认添加 + @FindBy (xpath ="//*[@id='product-list']/ul[1]/div[1]/li[1]/div[2]/div[3]/div[1]") + WebElement confirmAdd; + + //添加购物车时,提示加入一款成功toast + @FindBy (xpath ="//*[@class='util-bill-pd']") + WebElement toast; + + //右上角购物车 + @FindBy (xpath ="//*[@id='miniCart']") + WebElement minicart; + + //订购量 + @FindBy (xpath="//*[contains(text(),'quantity')]/../span[2]/input") + WebElement count; + + //活动商品-添加购物车 + @FindBy (xpath ="//*[@class='btn-box']/div[2]") + WebElement addToCart1; + + //查询输入框 + @FindBy (xpath ="//*[@class='search-tx']/input") + WebElement searchText; + + /* + * 页面方法 + */ + /** + * 加入到购物车中,且会进入购物车校验是否加入成功 + * @return ShoppingCartPage + */ + public ShoppingCartPage addToCart() { + if (Model.getIsactivity() == 0) {//该sku为非活动商品 + click(addToCart); + forceWait(1000); + click(count); + sendKeys(count, "50"); + }else if (Model.getIsactivity() == 1) {//该sku为活动商品 + click(addToCart1); + forceWait(1000); + click(count); + sendKeys(count, "200"); + } + + click(confirmAdd); + dynamicWait(By.xpath("//*[@class='util-bill-pd']")); + forceWait(1000); + click(minicart); + if (Model.getIsactivity() == 1) { + getManager();//找出对应的类目经理 + } + return new ShoppingCartPage(driver); + } + /** + * 由于操作过快,系统会提示:有人正在操作 + * sku加入到购物车,但不进入购物车,防止无法操作后续的拼柜 + * 此方法与addToCart()一样,只是不进入购物车 + */ + public void addSku() { + if (Model.getIsactivity() == 0) { + click(addToCart); + forceWait(1000); + click(count); + sendKeys(count, "50"); + }else if (Model.getIsactivity() == 1) { + click(addToCart1); + forceWait(1000); + click(count); + sendKeys(count, "200"); + } + click(confirmAdd); + dynamicWait(By.xpath("//*[@class='util-bill-pd']")); + if (Model.getIsactivity() == 1) { + sendKeys(searchText, "查询数据库ing……程序还在进行,无聊可以先去撩撩妹子呀!"); + getManager();//找出对应的类目经理 + } + } + + /** + * 根据sql查出商品对应类目经理,并在model类中设置其值 + */ + public void getManager() { + //查找商品对应的类目经理sql + String sql = "SELECT u.account_name from prd_goods g \r\n" + + "LEFT JOIN prd_goods_sku s on g.id = s.goods_id\r\n" + + "LEFT JOIN pri_user u on u.id = g.category_manager_id\r\n" + + "where s.`no` in ("+Model.getSkuNo()+");"; + Model.setManager(DBSqlSearch(sql, "account_name")); + } +} diff --git a/src/main/java/com/buyer/pageObject/MyOrderPage.java b/src/main/java/com/buyer/pageObject/MyOrderPage.java new file mode 100644 index 0000000..35c748c --- /dev/null +++ b/src/main/java/com/buyer/pageObject/MyOrderPage.java @@ -0,0 +1,11 @@ +package com.buyer.pageObject; + +import org.openqa.selenium.WebDriver; + +import com.essa.framework.BasePage; + +public class MyOrderPage extends BasePage { + public MyOrderPage(WebDriver driver) { + super(driver); + } +} diff --git a/src/main/java/com/buyer/pageObject/OrderPreviewPage.java b/src/main/java/com/buyer/pageObject/OrderPreviewPage.java new file mode 100644 index 0000000..acb0573 --- /dev/null +++ b/src/main/java/com/buyer/pageObject/OrderPreviewPage.java @@ -0,0 +1,48 @@ +package com.buyer.pageObject; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; + +/** + * @author Administrator + *订单预览页 + */ +public class OrderPreviewPage extends BasePage { + public OrderPreviewPage(WebDriver driver) { + super(driver); + } + + //是否授权:同意 + @FindBy (xpath ="//*[@ng-checked='list.isAuthorExchange==1']") + WebElement agree; + + //提交po + @FindBy (xpath ="//*[@id='react-orderConfirmation-submit']") + WebElement sendPO; + + //弹框:确认 + @FindBy (xpath ="//a[text()='Send PO']") + WebElement confirm; + + /** + * 提交po + * @return PayDepositPage + */ + public PayDepositPage submit() { +// while(!(isVisibility(By.xpath("//*[@ng-checked='list.isAuthorExchange==1']")))) { +// forceWait(1000); +// } + dynamicWait(By.xpath("//*[@ng-checked='list.isAuthorExchange==1']")); + moveHeightScroll("50"); + forceWait(500); + jsExecutorClick(agree); + click(sendPO); + forceWait(1000); + click(confirm); + return new PayDepositPage(driver); + } +} diff --git a/src/main/java/com/buyer/pageObject/PayDepositPage.java b/src/main/java/com/buyer/pageObject/PayDepositPage.java new file mode 100644 index 0000000..44d3b9a --- /dev/null +++ b/src/main/java/com/buyer/pageObject/PayDepositPage.java @@ -0,0 +1,69 @@ +package com.buyer.pageObject; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; +import com.essa.framework.Model; + +/** + * @author Administrator + *支付定金页 + */ +public class PayDepositPage extends BasePage { + public PayDepositPage(WebDriver driver) { + super(driver); + } + + //PO信息 + @FindBy (xpath="//*[contains(text(),'PO information')]") + WebElement POInfo; + + //查看资金详情---可用资金不足 + @FindBy (xpath ="//button[@class='submit-payment-deposit-button btn btn-primary']") + WebElement FundDetail; + + //免定金模式--确认按钮 + @FindBy (xpath ="//*[@ng-click='submit()']") + WebElement ok; + + //po单号 + @FindBy (xpath ="//*[contains(text(),'PO number:')]/../../td[2]/span") + WebElement poNum; + + /** + * 查看资金详情 + * @return AssetManagementPage + */ + public AssetManagementPage toAssetManagementPage() { + click(FundDetail); + return new AssetManagementPage(driver); + } + + /** + * 确认PO + * @return MyOrderPage + */ + public MyOrderPage confirm() { + click(ok); + return new MyOrderPage(driver); + } + + public void operate() { + /*while (!(isVisibility(By.xpath("//*[contains(text(),'PO information')]")))) { + forceWait(1000); + }*/ + dynamicWait(By.xpath("//*[contains(text(),'PO information')]")); + Model.setPoNum(poNum.getText()); + if (isVisibility(By.xpath("//button[@class='submit-payment-deposit-button btn btn-primary']"))) { + //如果是可用资金不足,跳转到资金管理 + toAssetManagementPage(); + }else if (isVisibility(By.xpath("//*[@ng-click='submit()']"))) { + //免定金模式,确认po,跳转到我的订单列表 + confirm(); + } + forceWait(2000); + } +} diff --git a/src/main/java/com/buyer/pageObject/RegisterPage.java b/src/main/java/com/buyer/pageObject/RegisterPage.java new file mode 100644 index 0000000..b99b48a --- /dev/null +++ b/src/main/java/com/buyer/pageObject/RegisterPage.java @@ -0,0 +1,165 @@ +package com.buyer.pageObject; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; +import com.essa.framework.Model; +import com.essa.framework.Tools; + +/** + * 采购商注册页 + * @author Administrator + * + */ +public class RegisterPage extends BasePage { + public RegisterPage(WebDriver driver) { + super(driver); + } + /* + * 元素定位 + */ + //检查点-是否进入页面 + @FindBy (xpath ="//*[contains(text(),' Own essa.cn account')]") + WebElement checkPoint; + + //email + @FindBy (xpath ="//*[@id='email']") + WebElement email; + + //password + @FindBy (xpath ="//*[@id='password']") + WebElement password; + + //confirmPassword + @FindBy (xpath ="//*[@id='confirmPassword']") + WebElement confirmPassword; + + //币种 currency + @FindBy (xpath ="//*[@id='currPlaceholder']") + WebElement currPlaceholder; + + //CNY + @FindBy (xpath="//*[text()='CNY']") + WebElement CNY; + + //companyName + @FindBy (xpath="//*[@id='companyName']") + WebElement companyName; + + //空白的地方-用于关闭选项框 + @FindBy (xpath ="//*[@class='register-right']") + WebElement blank; + + //区域continent + @FindBy (xpath ="//*[@id='continentPlaceholder']") + WebElement continentPlaceholder; + + //欧洲europe + @FindBy (xpath="//*[text()='Europe']") + WebElement Europe; + + //country + @FindBy (xpath ="//*[@id='countryPlaceholder']") + WebElement country; + + //俄罗斯Russian + @FindBy (xpath ="//*[text()='Russian federation']") + WebElement Russian; + + //contactName + @FindBy (xpath ="//*[@id='contactName']") + WebElement contactName; + + //phone + @FindBy (xpath ="//*[@id='phone']") + WebElement phone; + + //purchaseQuantity + @FindBy (xpath ="//*[@id='purchaseQuantity']") + WebElement purchaseQuantity; + + //quantity + @FindBy (xpath ="//*[contains(text(),'1 000 000 - 2 500 000 USD')]") + WebElement quantity; + + //singleQuantity + @FindBy (xpath ="//*[@id='singleQuantity']") + WebElement singleQuantity; + + //single + @FindBy (xpath ="//*[text()='30-49 ctn']") + WebElement single; + + //select + @FindBy (xpath ="//*[text()='Select']") + WebElement select; + + //toys1 + @FindBy (xpath ="//*[@title='Animals&plants']") + WebElement toys1; + + //toys2 + @FindBy (xpath ="//*[text()='Dolls and accessories']") + WebElement toys2; + + //toys3 + @FindBy (xpath ="//*[text()='Bricks']") + WebElement toys3; + + //referralCode + @FindBy (xpath ="//*[@id='referralCode']") + WebElement referralCode; + + //checkBox + @FindBy (xpath ="//*[@id='protocol']") + WebElement checkbox; + + //Register + @FindBy (xpath ="//*[@id='submit']") + WebElement register; + + /* + * 页面方法 + */ + /** + * 注册 + * @return IndexPage + */ + public IndexPage register() { + SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmm"); + String num = Tools.getTime(); + sendKeys(email, Model.getEmail()); + sendKeys(password, "essa123"); + sendKeys(confirmPassword, "essa123"); + click(currPlaceholder); + click(CNY); + sendKeys(companyName, "Auto"+num); + click(continentPlaceholder); + click(Europe); + click(Russian); + sendKeys(contactName, "Tester"+num); + sendKeys(phone, format.format(new Date())); + forceWait(500); + click(purchaseQuantity); + click(quantity); + forceWait(500); + click(singleQuantity); + click(single); + moveHeightScroll("100"); + jsExecutorClick(select); + click(toys1); + click(toys2); + click(toys3); + click(blank); + sendKeys(referralCode, Model.getInvateCode()); + jsExecutorClick(checkbox); + click(register); + forceWait(3000); + return new IndexPage(driver); + } +} diff --git a/src/main/java/com/buyer/pageObject/SettingMarksPage.java b/src/main/java/com/buyer/pageObject/SettingMarksPage.java new file mode 100644 index 0000000..a97f9cf --- /dev/null +++ b/src/main/java/com/buyer/pageObject/SettingMarksPage.java @@ -0,0 +1,46 @@ +package com.buyer.pageObject; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; + +/** + * 设置唛头页 + * @author Administrator + * + */ +public class SettingMarksPage extends BasePage { + public SettingMarksPage(WebDriver driver) { + super(driver); + } + //不应用唛头 + @FindBy (xpath ="//*[@title='No shipping marks for these products']") + WebElement noNeedMarks; + + //下一步 + @FindBy (xpath ="//*[text()='Next step']") + WebElement next; + + //弹框提示-确定 + @FindBy (xpath ="//*[text()='OK']") + WebElement ok; + + /** + * 设置唛头:不应用唛头 + * @return SettingStickerPage + */ + public SettingStickerPage setMarks() { + /*while(!(isVisibility(By.xpath("//*[@title='No shipping marks for these products']")))) { + forceWait(1000); + }*/ + dynamicWait(By.xpath("//*[@title='No shipping marks for these products']")); + click(noNeedMarks); + click(next); + forceWait(500); + click(ok); + return new SettingStickerPage(driver); + } +} diff --git a/src/main/java/com/buyer/pageObject/SettingStickerPage.java b/src/main/java/com/buyer/pageObject/SettingStickerPage.java new file mode 100644 index 0000000..cb97338 --- /dev/null +++ b/src/main/java/com/buyer/pageObject/SettingStickerPage.java @@ -0,0 +1,44 @@ +package com.buyer.pageObject; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; + +/** + * @author Administrator + *设置贴纸页 + */ +public class SettingStickerPage extends BasePage { + public SettingStickerPage(WebDriver driver) { + super(driver); + } + //不应用贴纸 + @FindBy (xpath ="//*[@title='No stickers for these products']") + WebElement noNeedSticker; + + //下一步 + @FindBy (xpath ="//*[text()='Next step']") + WebElement next; + + //弹框提示-确定 + @FindBy (xpath ="//*[text()='OK']") + WebElement ok; + + /** + * 设置贴纸:不应用贴纸 + * @return OrderPreviewPage + */ + public OrderPreviewPage setSticker() { + /*while (!(isVisibility(By.xpath("//*[@title='No stickers for these products']")))) { + forceWait(1000); + }*/ + dynamicWait(By.xpath("//*[@title='No stickers for these products']")); + click(noNeedSticker); + click(next); + click(ok); + return new OrderPreviewPage(driver); + } +} diff --git a/src/main/java/com/buyer/pageObject/ShoppingCartPage.java b/src/main/java/com/buyer/pageObject/ShoppingCartPage.java new file mode 100644 index 0000000..4057035 --- /dev/null +++ b/src/main/java/com/buyer/pageObject/ShoppingCartPage.java @@ -0,0 +1,81 @@ +package com.buyer.pageObject; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; +import com.essa.framework.Model; + +/** + * 购物车页 + * @author Administrator + * + */ +public class ShoppingCartPage extends BasePage { + public ShoppingCartPage(WebDriver driver) { + super(driver); + } + /* + * 元素定位 + */ + //关键字查询框 + @FindBy (xpath ="//*[@ng-model='keyword']") + WebElement keyword; + + //查询按钮 + @FindBy (xpath ="//*[contains(@ng-click,'search()')]") + WebElement searchButton; + + //搜索结果的一个sku对应的复选框 + @FindBy (xpath ="//*[contains(@class,'products-list ng-scope')]/div[2]/div[2]/span[1]/input") + WebElement checkbox; + + //可拼柜 + @FindBy (xpath="//*[text()='Consolidation allowed']") + WebElement consolidationAllowed; + + //开始拼柜 + @FindBy (xpath ="//button[contains(text(),' Start consolidation')]") + WebElement startConslidation; + + //确认采购按钮 + @FindBy (xpath = "//*[@class='products-list ng-scope']/div[2]/div/div[1]/div/span[5]/div/button") + WebElement confirmOrder; + + /* + * 页面方法 + */ + /** + * 断言sku是否已经加入购物车 + * @return true:已加入 false:未加入 + */ + public boolean isSucceed() { + mywait(keyword); + sendKeys(keyword, Model.getSkuNo()); + click(searchButton); + mywait(checkbox); + forceWait(2000); + return isVisibility(By.xpath("//*[contains(text(),'"+Model.getSkuNo()+"')]")); + } + /** + * 开始拼柜 + * @return ConslidationPage + */ + public ConslidationPage startConslidation() { + mywait(keyword); + click(consolidationAllowed); + mywait(startConslidation); + click(startConslidation); + return new ConslidationPage(driver); + } + + /** + * 确认采购 + */ + public void confirmOrder() { + dynamicLoad(By.xpath("//*[@class='products-list ng-scope']/div[2]/div/div[1]/div/span[5]/div/button")); + click(confirmOrder); + } +} diff --git a/src/main/java/com/buyer/testSuite/TestAddToCart.java b/src/main/java/com/buyer/testSuite/TestAddToCart.java new file mode 100644 index 0000000..c9076f1 --- /dev/null +++ b/src/main/java/com/buyer/testSuite/TestAddToCart.java @@ -0,0 +1,65 @@ +package com.buyer.testSuite; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.testng.asserts.SoftAssert; + +import com.buyer.pageObject.IndexPage; +import com.buyer.pageObject.KeywordResultPage; +import com.buyer.pageObject.ShoppingCartPage; +import com.essa.framework.Model; +import com.essa.pageObject.BaseTest; + +/** + * @author Administrator + *测试用例:采购商平台采购流程 + */ +public class TestAddToCart extends BaseTest { + WebDriver driver; + + @BeforeClass + public void setUp() { + initBuyer(); + loginBuyerValid(Model.getBuyerAccount(),Model.getBuyerPassword()); +// loginBuyerValid("buyer51551@essa.cn","essa123"); +// Model.setIsactivity(1); +// Model.setSkuNo(""); + } + @AfterClass + public void tearDown() { + driver.quit(); + } + + /** + * 关键字查询,并将搜到的结果加入购物车 + */ + @Test(description="关键字搜索,并将sku加入购物车",groups= {"first"}) + public void keywordToCart() { + this.driver = getDriver(); + IndexPage indexPage = PageFactory.initElements(driver, IndexPage.class); + indexPage.keywordSearch(); + KeywordResultPage keywordResultPage = PageFactory.initElements(driver, KeywordResultPage.class); + keywordResultPage.addToCart(); + //断言 + ShoppingCartPage shoppingCartPage = PageFactory.initElements(driver, ShoppingCartPage.class); + boolean actual = shoppingCartPage.isSucceed(); + SoftAssert softAssert = new SoftAssert(); + softAssert.assertEquals(actual, true, "加入购物车失败!"); + softAssert.assertAll(); + } + + /** + * 关键字查询,加入购物车,但不进入购物车,防止提示有人正在操作 + */ + @Test(description="将sku加入购物车") + public void addSku() { + this.driver = getDriver(); + IndexPage indexPage = PageFactory.initElements(driver, IndexPage.class); + indexPage.keywordSearch(); + KeywordResultPage keywordResultPage = PageFactory.initElements(driver, KeywordResultPage.class); + keywordResultPage.addSku(); + } +} diff --git a/src/main/java/com/buyer/testSuite/TestConfirmBuy.java b/src/main/java/com/buyer/testSuite/TestConfirmBuy.java new file mode 100644 index 0000000..3c5a363 --- /dev/null +++ b/src/main/java/com/buyer/testSuite/TestConfirmBuy.java @@ -0,0 +1,40 @@ +package com.buyer.testSuite; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import com.buyer.pageObject.IndexPage; +import com.buyer.pageObject.ShoppingCartPage; +import com.essa.framework.Model; +import com.essa.pageObject.BaseTest; + +public class TestConfirmBuy extends BaseTest { + + WebDriver driver; + + @BeforeTest + public void setUp() { + initBuyer(); + loginBuyerValid(Model.getBuyerAccount(),Model.getBuyerPassword()); + } + + @AfterClass + public void tearDown() { + driver.quit(); + } + + /** + * 登录采购商账号,确认订单 + */ + @Test(description="采购商确认采购") + public void confirmBuy() { + this.driver = getDriver(); + IndexPage indexPage = PageFactory.initElements(driver, IndexPage.class); + indexPage.toShoppingCartPage(); + ShoppingCartPage shoppingCartPage = PageFactory.initElements(driver, ShoppingCartPage.class); + shoppingCartPage.confirmOrder(); + } +} diff --git a/src/main/java/com/buyer/testSuite/TestRegister.java b/src/main/java/com/buyer/testSuite/TestRegister.java new file mode 100644 index 0000000..35573ce --- /dev/null +++ b/src/main/java/com/buyer/testSuite/TestRegister.java @@ -0,0 +1,45 @@ +package com.buyer.testSuite; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.testng.asserts.SoftAssert; + +import com.buyer.pageObject.IndexPage; +import com.buyer.pageObject.RegisterPage; +import com.essa.pageObject.BaseTest; + +/** + * @author Administrator + *测试用例:采购商注册信息填写 + */ +public class TestRegister extends BaseTest{ + WebDriver driver; + + @BeforeClass + public void setUp() { + initBuyer(); + } + + /** + * 注册buyer + */ + @Test(description="填写注册采购商信息,注册采购商") + public void register() { + this.driver = getDriver(); + IndexPage indexPage = PageFactory.initElements(driver, IndexPage.class); + indexPage.toRegisterPage(); + RegisterPage registerPage = PageFactory.initElements(driver, RegisterPage.class); + registerPage.register(); + + SoftAssert softAssert = new SoftAssert(); + softAssert.assertEquals(indexPage.isSucceed(), true, "采购商注册失败了!"); + softAssert.assertAll(); + } + @AfterClass + public void tearDown() { + driver.quit(); + } +} diff --git a/src/main/java/com/buyer/testSuite/TestSendPO.java b/src/main/java/com/buyer/testSuite/TestSendPO.java new file mode 100644 index 0000000..8c9bca7 --- /dev/null +++ b/src/main/java/com/buyer/testSuite/TestSendPO.java @@ -0,0 +1,64 @@ +package com.buyer.testSuite; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import com.buyer.pageObject.ConslidationPage; +import com.buyer.pageObject.IndexPage; +import com.buyer.pageObject.OrderPreviewPage; +import com.buyer.pageObject.PayDepositPage; +import com.buyer.pageObject.SettingMarksPage; +import com.buyer.pageObject.SettingStickerPage; +import com.buyer.pageObject.ShoppingCartPage; +import com.essa.framework.Model; +import com.essa.pageObject.BaseTest; + +/** + * @author Administrator + *测试用例:采购商平台采购流程 + */ +public class TestSendPO extends BaseTest { + WebDriver driver; + + @BeforeClass + public void setUp() { + initBuyer(); + loginBuyerValid(Model.getBuyerAccount(),Model.getBuyerPassword()); +// loginBuyerValid("buyer51551@essa.cn","essa123"); + } + @AfterClass + public void tearDown() { + driver.quit(); + } + + /** + * 开始拼柜 + */ + @Test(description="开始拼柜") + public void conslidation() { + this.driver = getDriver(); + IndexPage indexPage = PageFactory.initElements(driver, IndexPage.class); + indexPage.toShoppingCartPage(); + ShoppingCartPage shoppingCartPage = PageFactory.initElements(driver, ShoppingCartPage.class); + shoppingCartPage.startConslidation(); + ConslidationPage conslidationPage = PageFactory.initElements(driver, ConslidationPage.class); + conslidationPage.conslidation(); + } + /** + * 提交PO + */ + @Test(description="设置贴纸唛头,提交PO") + public void sendPO() { + this.driver = getDriver(); + SettingMarksPage settingMarksPage = PageFactory.initElements(driver, SettingMarksPage.class); + settingMarksPage.setMarks(); + SettingStickerPage settingStickerPage = PageFactory.initElements(driver, SettingStickerPage.class); + settingStickerPage.setSticker(); + OrderPreviewPage orderPreviewPage = PageFactory.initElements(driver, OrderPreviewPage.class); + orderPreviewPage.submit(); + PayDepositPage payDepositPage = PageFactory.initElements(driver, PayDepositPage.class); + payDepositPage.operate(); + } +} diff --git a/src/main/java/com/essa/framework/BasePage.java b/src/main/java/com/essa/framework/BasePage.java new file mode 100644 index 0000000..a656e03 --- /dev/null +++ b/src/main/java/com/essa/framework/BasePage.java @@ -0,0 +1,700 @@ +package com.essa.framework; + +import java.awt.Robot; +import java.awt.Toolkit; +import java.awt.datatransfer.StringSelection; +import java.awt.event.KeyEvent; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.sql.Connection; +import java.sql.ResultSet; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.apache.commons.io.FileUtils; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.openqa.selenium.Alert; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.OutputType; +import org.openqa.selenium.TakesScreenshot; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.Select; +import org.openqa.selenium.support.ui.WebDriverWait; + +import com.essa.framework.BasePage; +import com.essa.framework.LogType; +import com.essa.framework.Logger; +import com.mysql.cj.jdbc.PreparedStatement; + +public class BasePage { + + public static WebDriver driver; + public static String pageTitle; + public static String pageUrl; + public static String OutputFileName = getDateTimeByFormat(new Date(), "yyyyMMdd_HHmmss"); + + /** + * 构造方法 + * @param driver + */ + public BasePage(WebDriver driver) { + BasePage.driver = driver; + } + + /** + * 在文本框内输入字符 + * @param element + * @param text + */ + protected void sendKeys(WebElement element, String text) { + try { + mywait(element); + if (element.isEnabled()) { + element.clear(); + Logger.Output(LogType.LogTypeName.INFO, "清除文本框中已有字符:" + partialStr(element.toString(), "xpath:")); + element.sendKeys(text); + Logger.Output(LogType.LogTypeName.INFO, "输入的字符是:" + text); + } + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, element.toString()+"元素不存在"); + } + + } + + /** + * 点击元素,这里指点击鼠标左键 + * @param element + */ + protected void click(WebElement element) { + + try { + mywait(element); + if (element.isEnabled()) { + Logger.Output(LogType.LogTypeName.INFO, "点击元素:" + partialStr(element.toString(), "xpath:")); + element.click(); + } + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + "."); + } + + } + + /** + * 在文本输入框执行清除操作 + * @param element + */ + protected void clear(WebElement element) { + try { + if (element.isEnabled()) { + element.clear(); + Logger.Output(LogType.LogTypeName.INFO, "清除输入框中字符:" + partialStr(element.toString(), "xpath:") ); + } + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + "."); + } + + } + + /** + * 判断一个页面元素是否显示在当前页面 + * @param element + */ + protected void verifyElementIsPresent(WebElement element) { + + try { + if (element.isDisplayed()) { + Logger.Output(LogType.LogTypeName.INFO, "元素存在:" + partialStr(element.toString(), "xpath:").trim()); + + } + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + "."); + } + } + + /** + * 获取页面的标题 + * @return + */ + protected String getCurrentPageTitle() { + + pageTitle = driver.getTitle(); + Logger.Output(LogType.LogTypeName.INFO, "当前页面的标题为:" + pageTitle); + return pageTitle; + } + + /** + * 获取页面的url + * @return + */ + public static String getCurrentPageUrl() { + pageUrl = driver.getCurrentUrl(); + Logger.Output(LogType.LogTypeName.INFO, "当前页面的URL为:" + pageUrl); + return pageUrl; + } + + /** + * 处理多窗口之间切换 + */ + protected void switchWindow() { + + String currentWindow = driver.getWindowHandle();// 获取当前窗口句柄 + Set handles = driver.getWindowHandles();// 获取所有窗口句柄 + Logger.Output(LogType.LogTypeName.INFO, "当前窗口数量: " + handles.size()); + Iterator it = handles.iterator(); + while (it.hasNext()) { + if (currentWindow == it.next()) { + driver.close(); + continue; + } + try { + // driver.close();// 关闭旧窗口 + WebDriver window = driver.switchTo().window(it.next());// 切换到新窗口 + Logger.Output(LogType.LogTypeName.INFO, "新窗口的标题为:" + window.getTitle()); + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, "无法切换到新打开窗口" + e.getMessage()); + + } + // driver.close();//关闭当前焦点所在的窗口 + } + // driver.switchTo().window(currentWindow);//回到原来页面 + } + + /** + * 处理多窗口之间切换 + * 将会关闭当前的窗口 + */ + protected void switchMoreWindow() { + + String handle = driver.getWindowHandle(); + for(String temhandle : driver.getWindowHandles()) { + if (!temhandle.equals(handle)) { + driver.close(); + driver.switchTo().window(temhandle); + } + } + } + /** + * 浏览器弹框操作,true确认弹框,false取消弹框 + * @param isAccept + */ + protected void alert(boolean isAccept) { + Alert alert = driver.switchTo().alert(); + if (isAccept) { + Logger.Output(LogType.LogTypeName.INFO, "提示框内容为:" + alert.getText()); + alert.accept(); + Logger.Output(LogType.LogTypeName.INFO, "确认弹框"); + } else { + Logger.Output(LogType.LogTypeName.INFO, "提示框内容为:" + alert.getText()); + alert.dismiss(); + Logger.Output(LogType.LogTypeName.INFO, "取消弹框"); + } + } + + /** + * 下拉框选择选项 + * 元素必须可以使用select,input和button使用会报错 + * @param element + * @param optionText + */ + protected void selectElement(WebElement element, String optionText) { + Select select = new Select(element); + select.selectByVisibleText(optionText); + Logger.Output(LogType.LogTypeName.INFO, "选择选项:" + optionText); + } + + /** + * 下拉框选择选项,通过选项中的value来定位 + * @param element + * @param value + */ + protected void selectElement(WebElement element, int value) { + Select select = new Select(element); + select.selectByIndex(value); + Logger.Output(LogType.LogTypeName.INFO, "选择选项:" + value); + } + /** + * 判断元素在页面中是否存在 + * @param element + * @return boolean + */ + protected boolean isElementExist(WebElement element) { + try { + Boolean bool = element.isDisplayed(); + + Logger.Output(LogType.LogTypeName.INFO, "检查元素是否存在:" +partialStr(element.toString(), "xpath:")+":"+ bool); + return bool; + } catch (NoSuchElementException e) { + takeScreenShot(); + Logger.Output(LogType.LogTypeName.ERROR, "无法确认当前元素是否存在:" + e.getMessage()); + return false; + } + } + + /** + * 元素在页面上是否可见,不建议用此方法,有时会报错,找不出原因 + * @param element + * @return boolean + */ + protected boolean isVisibility(WebElement element) { + try { + if(ExpectedConditions.visibilityOf(element) != null) { + Logger.Output(LogType.LogTypeName.INFO, "元素在页面上可见"); + return true; + } + } catch (NoSuchElementException e) { + Logger.Output(LogType.LogTypeName.ERROR, "无法页面上是否有此元素"); + return false; + } + Logger.Output(LogType.LogTypeName.INFO, "元素在页面不可见"); + return false; + } + + /** + * 元素在页面上是否可见 + * @param element + * @return + */ + protected boolean isVisibility(By by) { + try { + Logger.Output(LogType.LogTypeName.INFO, "检查元素在页面上是否可见"); + if(ExpectedConditions.visibilityOf(driver.findElement(by)) != null) { + Logger.Output(LogType.LogTypeName.INFO, "元素可见:"+by.toString()); + return true; + } + } catch (NoSuchElementException e) { + } + Logger.Output(LogType.LogTypeName.INFO, "元素不可见:"+by.toString()); + return false; + } + + + /** + * 获取元素的文本值 + * @param element + */ + protected String getText(WebElement element) { + + try { + if (element.isEnabled()) { + Logger.Output(LogType.LogTypeName.INFO, "获取当前元素的文本值:" + element.getText()); + return element.getText(); + } + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + "."); + } + return null; + } + + /** + * js的点击操作 + * @param element + */ + protected void jsExecutorClick(WebElement element) { + try { + mywait(element); + JavascriptExecutor jsExecutor = (JavascriptExecutor) driver; + jsExecutor.executeScript("arguments[0].click();", element); + Logger.Output(LogType.LogTypeName.INFO, "调用JavaScript点击元素:" + partialStr(element.toString(), "xpath:")); + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + "."); + } + + } + + /** + * js的删除操作 + * @param webElement + * @param attribute + */ + protected void jsExecutorRemoveAttribute(WebElement webElement, String attribute) { + try { + JavascriptExecutor jsExecutor = (JavascriptExecutor) driver; + jsExecutor.executeScript("arguments[0].removeAttribute('" + attribute + "');", webElement); + Logger.Output(LogType.LogTypeName.INFO, "调用JavaScript删除元素属性:" + attribute); + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + "."); + } + + } + + /** + * 获取js返回的值 + * @param webElement + * @return + */ + protected String jsExecutorGetAttributeValue(WebElement webElement) { + try { + JavascriptExecutor jsExecutor = (JavascriptExecutor) driver; + Logger.Output(LogType.LogTypeName.INFO, "调用JavaScript返回元素属性值"); + return (String) jsExecutor.executeScript("return arguments[0].id;", webElement); + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + "."); + return null; + } + } + + /** + * 读取excel中的数据 + * @param filepath excel的路径地址 + * @param filename excel的文件名 + * @param SheetName excel的worksheet名 + * @return + * @throws Exception + */ + public static Object[][] readExcel(String filepath, String filename, String SheetName){ + try { + File file = new File(filepath + "\\" + filename); + FileInputStream inputStream = new FileInputStream(file); + Workbook Workbook = null; + // 获取文件扩展名 + String fileExtensionName = filename.substring(filename.indexOf(".")); + Logger.Output(LogType.LogTypeName.INFO, "获取所要读取的文件"); + // 判断是.xlsx还是.xls的文件并进行实例化 + if (fileExtensionName.equals(".xlsx")) { + Workbook = new XSSFWorkbook(inputStream); + Logger.Output(LogType.LogTypeName.INFO, "文件为:.xlsx格式"); + } else if (fileExtensionName.equals(".xls")) { + Workbook = new HSSFWorkbook(inputStream); + Logger.Output(LogType.LogTypeName.INFO, "文件为:.xls格式"); + } + // 通过sheetName生成Sheet对象 + Sheet Sheet = Workbook.getSheet(SheetName); + int rowCount = Sheet.getLastRowNum() - Sheet.getFirstRowNum(); + List records = new ArrayList(); + for (int i = 0; i < rowCount + 1; i++) { + Row row = Sheet.getRow(i); + String fields[] = new String[row.getLastCellNum()]; + for (int j = 0; j < row.getLastCellNum(); j++) { + if (row.getCell(j).getCellType() == Cell.CELL_TYPE_NUMERIC) { + row.getCell(j).setCellType(Cell.CELL_TYPE_STRING); + } + // 判断数据的类型 + switch (row.getCell(j).getCellType()) { + case Cell.CELL_TYPE_NUMERIC: // 数字 + fields[j] = String.valueOf(row.getCell(j).getNumericCellValue()); + break; + case Cell.CELL_TYPE_STRING: // 字符串 + fields[j] = String.valueOf(row.getCell(j).getStringCellValue()); + break; + case Cell.CELL_TYPE_BOOLEAN: // Boolean + fields[j] = String.valueOf(row.getCell(j).getBooleanCellValue()); + break; + case Cell.CELL_TYPE_FORMULA: // 公式 + fields[j] = String.valueOf(row.getCell(j).getCellFormula()); + break; + case Cell.CELL_TYPE_BLANK: // 空值 + fields[j] = ""; + break; + case Cell.CELL_TYPE_ERROR: // 故障 + fields[j] = "非法字符"; + break; + default: + fields[j] = "未知类型"; + break; + } + } + records.add(fields); + } + Object[][] results = new Object[records.size()][]; + for (int i = 0; i < records.size(); i++) { + results[i] = records.get(i); + } + Logger.Output(LogType.LogTypeName.INFO, "读取文件成功"); + return results; + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + "."); + } + return null; + } + + /** + * 上传文件 + * @param filePath + * @throws Exception + */ + protected void uploadFile(String filePath){ + try { + Logger.Output(LogType.LogTypeName.INFO, "开始上传文件"); + StringSelection sel = new StringSelection(filePath); + Toolkit.getDefaultToolkit().getSystemClipboard().setContents(sel, null); + // 新建一个Robot类的对象 + Robot robot = new Robot(); + Thread.sleep(1000); + + // 按下回车 + robot.keyPress(KeyEvent.VK_ENTER); + + // 释放回车 + robot.keyRelease(KeyEvent.VK_ENTER); + + // 按下 CTRL+V + robot.keyPress(KeyEvent.VK_CONTROL); + robot.keyPress(KeyEvent.VK_V); + + // 释放 CTRL+V + robot.keyRelease(KeyEvent.VK_CONTROL); + robot.keyRelease(KeyEvent.VK_V); + Thread.sleep(1000); + + // 点击回车 Enter + robot.keyPress(KeyEvent.VK_ENTER); + robot.keyRelease(KeyEvent.VK_ENTER); + + Logger.Output(LogType.LogTypeName.INFO, "上传文件成功"); + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + "."); + } + } + + /** + * 字符串切片 + * @param element 需要被操作的元素 + * @param begin 从这个字符开始切 + * @param end 到这个字符结尾 + * 例子:某个元素的文本值为:广州市天河区猎德,只要“天河区” + * 第二个参数:天, 第三个参数:区 + * @return + */ + protected String partialStr(WebElement element, String begin, String end) { + String result_string = element.getText(); + Logger.Output(LogType.LogTypeName.INFO, "获取所需切片的字符串"); + // 根据词切片,取第二片字符串 + String st1 = result_string.split(begin)[1]; + Logger.Output(LogType.LogTypeName.INFO, "切除" + begin + "之前的字符串"); + // 再切一次结尾,得到我们想要的结果 + String search_need = st1.split(end)[0]; + Logger.Output(LogType.LogTypeName.INFO, "切除" + end + "之后的字符串"); + Logger.Output(LogType.LogTypeName.INFO, "返回切片后的字符串"); + return search_need; + } + + /** + * 复写切片,仅在本页面作为截断日志文本后面带的一堆字符串 + * @param string + * @param begin + * @return + */ + protected String partialStr(String string,String begin) { + String st1 = string.split(begin)[1]; + return st1; + } + + /**要的元素是否存在,最多5秒 + * @param element + */ + protected void mywait(WebElement element) { + + WebDriverWait wait = new WebDriverWait(driver, 7); +// Logger.Output(LogType.LogTypeName.INFO, "等待元素在页面上加载可见,最多5秒"); + wait.until(ExpectedConditions.visibilityOf(element)); + } + + /** + * 设立检查点,判断页面是否是我们要的 + * @param checkPoint + * @param element + * @return + */ + protected boolean isThisPage(String checkPoint,WebElement element) { + boolean bool1=checkPoint.equals(element.getText()); + Logger.Output(LogType.LogTypeName.INFO, "判断检查点是否存在:"+bool1); + return bool1; + } + + /** + * 截图当前页面 + */ + protected void takeScreenShot() { + File src = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); + + try { + // 拷贝截图文件到我们项目./Screenshots + FileUtils.copyFile(src, new File(".\\Log\\Screenshots\\"+OutputFileName+"截图.png")); + Logger.Output(LogType.LogTypeName.INFO, "截图当前页面成功!"); + } + + catch (IOException e) { + System.out.println(e.getMessage()); + Logger.Output(LogType.LogTypeName.ERROR, "截图当前页面失败!"); + } + + } + + /** + * 上下移动滚动条,这里使用js操作 + * @param percent 0:最下方 100:最上方 + */ + protected void moveHeightScroll(String percent) { + JavascriptExecutor js = (JavascriptExecutor)driver; + js.executeScript("scrollBy(0, 0-document.body.scrollHeight *"+percent+"/100)"); + try { + Thread.sleep(1000); + } catch (Exception e) { + } + Logger.Output(LogType.LogTypeName.INFO, "上下拖动滚动条"); + } + + /** + * 左右移动滚动条 + * @param percent 0:最左 100:最右 + */ + protected void moveWidthScroll(String percent) { + JavascriptExecutor js = (JavascriptExecutor)driver; + js.executeScript("scrollBy(0, 0-document.body.scrollWidth *"+percent+"/100)"); + Logger.Output(LogType.LogTypeName.INFO, "左右拖动滚动条"); + } + + /** + * 鼠标点击 + * @param element + */ + protected void actionClick(WebElement element) { + try { + Actions action = new Actions(driver); + Logger.Output(LogType.LogTypeName.INFO, "鼠标事件点击元素"); + action.click(element).perform(); + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, "鼠标事件点击元素失败!"); + } + } + + /** + * 鼠标双击 + * @param element + */ + protected void actionDoubleClick(WebElement element) { + try { + Actions action = new Actions(driver); + Logger.Output(LogType.LogTypeName.INFO, "鼠标双击元素"); + action.doubleClick(element).perform(); + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, "鼠标双击元素失败!"); + } + } + + + /** + * 模拟鼠标事件拖动元素 + * @param element 需要拖动的元素 + * @param horizontal 水平方向:正数向右,负数向左 + * @param vertical 垂直方向:正数向上,负数向下 + */ + protected void jsExecutorDragAndDrop(WebElement element,int horizontal,int vertical) { + try { + Actions action = new Actions(driver); + action.dragAndDropBy(element, horizontal, vertical).perform(); + Logger.Output(LogType.LogTypeName.INFO, "使用鼠标拖动,将元素水平拖动"+horizontal+" 垂直拖动"+vertical); + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + "."); + } + } + + /** + * 移动鼠标到指定元素 + * @param element + */ + public void moveMouse(WebElement element) { + try { + Actions action = new Actions(driver); + Logger.Output(LogType.LogTypeName.INFO, "移动鼠标到指定元素上"); + action.moveToElement(element).perform(); + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, "移动鼠标失败了~"); + } + } + + /** + * 键盘回车 + * @param element + */ + protected void enter(WebElement element) { + try { + Logger.Output(LogType.LogTypeName.INFO, "对元素进行键盘回车"); + element.sendKeys(Keys.ENTER); + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, "键盘回车失败!"); + } + } + + /** + * 强行等待,有时候页面加载需要时间,检查点检测不出使用 + * @param msec + */ + protected void forceWait(int msec) { + try { + Logger.Output(LogType.LogTypeName.INFO, "强行等待:"+msec/1000+"秒"); + Thread.sleep(msec); + } catch (Exception e) { + Logger.Output(LogType.LogTypeName.ERROR, "强行等待失败"); + } + } + /** + * 动态等待,如果元素不存在,等待一秒直到元素出现,最长7秒 + * @param by + */ + protected void dynamicWait(By by) { + for(int count=0;count<7&&!(isVisibility(by));count++) { + forceWait(1000); + } + } + + /** + * 与上面的方法相反,如果元素存在,等待直到元素不存在,最长7秒 + * @param by + */ + protected void dynamicLoad(By by) { + for(int count=0;count<7&&isVisibility(by);count++) { + forceWait(1000); + } + } + /** + * 连接数据库查询数据 + * @param sql 查询sql + * @param field 需要的字段,这个方法只支持一个字段查询 + * @return 返回字段值 + */ + protected String DBSqlSearch(String sql,String field) { + try { + Connection conn = DButil.getCon(); + PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement(sql); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + return rs.getString(field); + } + DButil.close(rs, pstmt, conn); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 获取当前系统时间,得到格式化时间字符串 + * @param date + * @param format + * @return + */ + protected static String getDateTimeByFormat(Date date, String format) { + + SimpleDateFormat df = new SimpleDateFormat(format); + + return df.format(date); + + } +} \ No newline at end of file diff --git a/src/main/java/com/essa/framework/BasePage1.java b/src/main/java/com/essa/framework/BasePage1.java new file mode 100644 index 0000000..025790f --- /dev/null +++ b/src/main/java/com/essa/framework/BasePage1.java @@ -0,0 +1,38 @@ +package com.essa.framework; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class BasePage1 { + public static WebDriver driver; + /** + * 构造方法 + * @param driver + */ + public BasePage1(WebDriver driver) { + BasePage.driver = driver; + } + /** + * 填写文本 + * @param element 元素 + * @param text 文本值 + */ + protected void sendKeys(WebElement element, String text) { + element.clear();// 清除原有文本 + element.sendKeys(text); + } + /** + * 鼠标左键点击 + * @param element 元素 + */ + protected void click(WebElement element) { + element.click(); + } + /** + * 获取当前页面的标题 + * @return 标题 + */ + protected String getCurrentPageTitle() { + return driver.getTitle(); + } +} diff --git a/src/main/java/com/essa/framework/BrowserEngine.java b/src/main/java/com/essa/framework/BrowserEngine.java new file mode 100644 index 0000000..def6c93 --- /dev/null +++ b/src/main/java/com/essa/framework/BrowserEngine.java @@ -0,0 +1,143 @@ +package com.essa.framework; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.ie.InternetExplorerDriver; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; +import java.util.concurrent.TimeUnit; + +public class BrowserEngine { + + private static String browserName; + private String serverURL; + private String buyerURL; + private static WebDriver driver; + private static String env1; + + public void initConfigData() throws IOException{ + Properties p = new Properties(); + // 加载配置文件 +// System.load("./config.properties"); +// InputStream a = ClassLoader.getSystemResourceAsStream("config.properties"); +// System.out.println("browserName + " + System.getProperty("browserName")); + InputStream ips = new FileInputStream(".\\src\\main\\resources\\config.properties"); + p.load(ips); +// Logger.Output(LogType.LogTypeName.INFO, "开始从配置文件中选择浏览器"); + browserName=p.getProperty("browserName");//使用jframe要注释 + Logger.Output(LogType.LogTypeName.INFO, "所选择的浏览器类型为: "+ browserName); + if (env1=="DIT") { + serverURL = p.getProperty("DIT"); + buyerURL = p.getProperty("BDIT"); + }else if (env1 =="HOTFIX") { + serverURL = p.getProperty("HOTFIX"); + buyerURL = p.getProperty("BHOTFIX"); + }else if (env1 == "UAT") { + serverURL = p.getProperty("UAT"); + buyerURL = p.getProperty("BUAT"); + }else { + serverURL = p.getProperty("SIT"); + buyerURL = p.getProperty("BSIT"); + } + Logger.Output(LogType.LogTypeName.INFO, "所测试的环境为:"+ env1); + Model.setEnv(env1);//我也不知道为什么执行完上面的代码后,env会变为sit + ips.close(); + } + /** + * bpms环境初始化 + * @param environment + * @param browser + */ + public static void setInit(String environment,String browser) { + browserName = browser; + env1 = environment; + } + + /** + * bpms获取地址方法 + * @return + */ + public WebDriver getBrowser(){ + + if(browserName.equalsIgnoreCase("Firefox")){ + System.setProperty("webdriver.gecko.driver", ".\\resources\\geckodriver.exe"); + driver = new FirefoxDriver(); + Logger.Output(LogType.LogTypeName.INFO, "正在启动FireFox浏览器"); + } + else if(browserName.equals("Chrome")){ + System.setProperty("webdriver.chrome.driver", ".\\src\\main\\resources\\chromedriver.exe"); //图形界面 + driver= new ChromeDriver(); + Logger.Output(LogType.LogTypeName.INFO, "正在启动Chrome浏览器"); + }else if(browserName.equalsIgnoreCase("IE")){ + System.setProperty("webdriver.ie.driver", ".\\src\\main\resources\\IEDriverServer.exe"); + driver= new InternetExplorerDriver(); + Logger.Output(LogType.LogTypeName.INFO, "正在启动IE浏览器"); + } + driver.manage().window().maximize(); + Logger.Output(LogType.LogTypeName.INFO, "窗口最大化"); + driver.get(serverURL); + Logger.Output(LogType.LogTypeName.INFO, "打开URL: "+ serverURL); + callWait(5); + return driver; + } + + /** + * buyer获取浏览器,并读取buyer的地址 + * @return + */ + public WebDriver buyerGetBrowser() { + if (browserName.equals("Chrome")) { + System.setProperty("webdriver.chrome.driver", ".\\resources\\chromedriver.exe"); //图形界面 + driver= new ChromeDriver(); + Logger.Output(LogType.LogTypeName.INFO, "正在启动Chrome浏览器"); + }else if (browserName.equals("Firefox")) { + System.setProperty("webdriver.gecko.driver", ".\\resources\\geckodriver.exe"); + driver = new FirefoxDriver(); + Logger.Output(LogType.LogTypeName.INFO, "正在启动FireFox浏览器"); + } + driver.manage().window().maximize(); + Logger.Output(LogType.LogTypeName.INFO, "窗口最大化"); + driver.get(buyerURL); + Logger.Output(LogType.LogTypeName.INFO, "打开URL: "+ buyerURL); + callWait(5); + return driver; + } + + + /** + * 退出驱动 + * @throws InterruptedException + */ + public void tearDown() throws InterruptedException{ + Logger.Output(LogType.LogTypeName.INFO, "关闭浏览器"); + driver.quit(); + Thread.sleep(3000); + } + + /** + * 隐式时间等待方法 + * @param time + */ + public void callWait(int time){ + + driver.manage().timeouts().implicitlyWait(time, TimeUnit.SECONDS); + Logger.Output(LogType.LogTypeName.INFO, "设置隐性等待"+time+" 秒"); + } + /** + *跳过安全链接 + */ + public void anQuan() { + // 创建DesiredCapabilities类的一个对象实例 + DesiredCapabilities cap=DesiredCapabilities.chrome(); + // 设置变量ACCEPT_SSL_CERTS的值为True + cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); + Logger.Output(LogType.LogTypeName.INFO, "设置浏览器可以打开不安全链接"); + } +} + diff --git a/src/main/java/com/essa/framework/DBInfo.java b/src/main/java/com/essa/framework/DBInfo.java new file mode 100644 index 0000000..e516a3a --- /dev/null +++ b/src/main/java/com/essa/framework/DBInfo.java @@ -0,0 +1,74 @@ +package com.essa.framework; + +public class DBInfo { + + //sit + public static String sitJdbcName = "com.mysql.cj.jdbc.Driver"; + public static String sitSqlUrl = "jdbc:mysql://192.168.1.247:3307/bpms"; + public static String sitUser = "root"; + public static String sitPassword = "redhat"; + //hotfix + public static String hotfixJdbcName = "com.mysql.cj.jdbc.Driver"; + public static String hotfixSqlUrl = "jdbc:mysql://192.168.1.19:3321/bpms"; + public static String hotfixUser = "essa_hotfix"; + public static String hotfixPassword = "essa^_hotfix^D checkBoxes; + + //是否服务过大客户:是 + @FindBy (xpath = ".//*[contains(text(),'是否服务过大客户')]/../div[1]/label[1]") + WebElement isServLargeCus; + + //是否服务过大客户:否 + @FindBy (xpath = ".//*[contains(text(),'是否服务过大客户')]/../div[1]/label[2]") + WebElement notServLargeCus; + + //服务过的大客户数 + @FindBy (xpath = ".//*[@list='ctrl.model.serviceLargeCustomerList']/div/table/tbody/tr") + List customers; + + //大客户的“+” + @FindBy (xpath = ".//*[@list='ctrl.model.serviceLargeCustomerList']/div/div/button[1]") + WebElement addCustomer; + + //大客户名称文本框 + public WebElement largeCusName(int i) { + String xpath = ".//*[@list='ctrl.model.serviceLargeCustomerList']/div/table/tbody/tr["+i+"]/td[2]/input"; + return driver.findElement(By.xpath(xpath)); + } + + //备注文本框 + public WebElement note(int i) { + String xpath = ".//*[@list='ctrl.model.serviceLargeCustomerList']/div/table/tbody/tr["+i+"]/td[3]/input"; + return driver.findElement(By.xpath(xpath)); + } + + //确定按钮 + @FindBy (xpath = "//*[text()='确定']") + WebElement submit; + + //标签页名称 + @FindBy (xpath ="//*/a[contains(text(),'综合实力评估')]") + WebElement labelName; + + //提交完成后,操作成功的弹框关闭按钮 + @FindBy (xpath="//*[@class='close']") + WebElement alertClosed; + + //关闭页面 + @FindBy(xpath = "//*[text()='综合实力评估']/../span") + WebElement closed; + + + /* + * 方法 + */ + + //选择配合度 + public void selectCooperateDegree(String cooperateGrade) { + + //选择配合度:高、中、低 + selectElement(cooperateDegree, cooperateGrade); + + } + + //是否有研发能力,参数可选 是/否 + public void isDevAblity(String ablity) { + if("是".equals(ablity)) + click(isDev); + else { + click(notDev); + } + } + + // + + //提交编辑 + public void submit() { + moveHeightScroll("0"); + click(submit); + + } + + //勾选每季度有新品推出 + public void newProduct() { + if(newGoodsEveryQuarter.isSelected());//判断是否已勾选 + else { + isElementExist(newGoodsEveryQuarter); + click(newGoodsEveryQuarter); + } + } + + //勾选有配备工程师 + public void haveEngineer() { + if(existsEngineer.isSelected()); + else { + isElementExist(existsEngineer); + click(existsEngineer); + } + } + + //勾选有研发团队 + public void haveTeam() { + if (existsProductDev.isSelected()); + else { + isElementExist(existsProductDev); + click(existsProductDev); + } + } + + //勾选“其他” + public void other() { + if(others.isSelected()); + else { + click(others); + isElementExist(otherDevAbilValue); + sendKeys(otherDevAbilValue, "我们每天都有新品推出!"); + } + } + + + //拖动滚动条,因为本页面如果数据量多,就看不到头部的关闭本页面的X + public void moveScroll() { + + moveHeightScroll("100"); + + } + + //检查是否列表加载完成 + public boolean isSucceed() throws InterruptedException { + while(!(labelName.isDisplayed())) { + Thread.sleep(1000); + } + return isElementExist(labelName); + + } + + //判断是否提交成功 + public boolean isSubmit() { + + return isElementExist(alertClosed); + + } + + //关闭“操作成功”提示 + public void alertClosed() { + click(alertClosed); + } + + /* + * 添加证书逻辑: + * 1.点击是否有证书:是 + * 2.点击“+” + * 3.统计已有x个证书 + * 4.i=x + * 5.选择证书类型WRAP,证书编号,证书说明,传证书图片 + * 6.判断证书是否上传成功,不成功则等待 + */ + public void addCertification() throws Exception { + click(isCertificate); + isElementExist(addCertificate); + click(addCertificate); + + List list= checkBoxes; + int x = list.size(); + + selectElement(itemType(x), "WRAP"); + sendKeys(itemCode(x), "20180331:"+x); + sendKeys(itemDec(x), "证书说明:这是第"+x+"个证书"); + click(itemFile(x)); + uploadFile("E:\\pic\\证书.jpg"); + + //如果图片是系统默认的图片,则等待1秒 + while("/img/nopic.jpg".equals(imge(x).getAttribute("ng-src"))) { + Thread.sleep(1000); + } + } + + /* + * 添加服务大客户记录 + * 先把滚动条拉下来,不然找不到元素 + * 1.是否服务过大客户,点击:是 + * 2.点击“+” + * 3.判断已有服务过的次数x,i=x + * 4.写入大客户名称,备注 + */ + public void addSerLargeCus() { + moveHeightScroll("0"); + click(isServLargeCus); + isElementExist(addCustomer); + click(addCustomer); + List list = customers; + int x = list.size(); + sendKeys(largeCusName(x), "第"+x+"大客户"); + sendKeys(note(x), "这个是备注信息"+x); + } + + //选择主打产品 + public void selMainProduct(String degree) { + selectElement(mainProduct, degree); + } + + //关闭本页面 + public void closed() { + + click(closed); + + } +} diff --git a/src/main/java/com/essa/pageObject/buyPlaneManage/SkuCategoryManagerCongfigPage.java b/src/main/java/com/essa/pageObject/buyPlaneManage/SkuCategoryManagerCongfigPage.java new file mode 100644 index 0000000..7e7c4cd --- /dev/null +++ b/src/main/java/com/essa/pageObject/buyPlaneManage/SkuCategoryManagerCongfigPage.java @@ -0,0 +1,84 @@ +package com.essa.pageObject.buyPlaneManage; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; +import com.essa.framework.Model; + +/** + * @author Administrator + *商品类目经理管理配置页 + */ +public class SkuCategoryManagerCongfigPage extends BasePage { + public SkuCategoryManagerCongfigPage(WebDriver driver) { + super(driver); + } + /* + * 页面元素定位 + */ + + //查询输入框 + @FindBy (xpath="//*[@placeholder='请输入关键信息查询']") + WebElement searchContent; + + //高级查询 + @FindBy (xpath="//*[contains(text(),'高级查询')]") + WebElement advancedQuery; + + //sku编号 + @FindBy (xpath="//*[contains(text(),'SKU编号')]/../div/input") + WebElement skuNoQuery; + + //高级查询按钮 + @FindBy (xpath="//*[text()='查询']") + WebElement query; + + //查询按钮 + @FindBy (xpath="//*[@ng-click='search()']") + WebElement search; + + //右下角分页的GO按钮,用作检查点,等待页面加载完成 + @FindBy (xpath="//*[text()='GO']") + WebElement checkPoint; + + //列表第一条数据的复选框 + @FindBy (xpath="//*[@ng-table='tableParams']/tbody/tr[1]/td[1]/input") + WebElement firstCheckBox; + + //分配类目经理 + @FindBy (xpath="//*[text()='分配类目经理']") + WebElement distribute; + + //选择类目经理 + @FindBy (xpath="//*[@ng-model='mgrOpt']") + WebElement selectManager; + + //确认类目经理 + @FindBy(xpath="//*[text()='确认']") + WebElement confirm; + + /* + * 页面方法 + */ + + /** + * 商品分配类目经理 + * @return SkuCategoryManagerCongfigPage + */ + public SkuCategoryManagerCongfigPage distributeManager() { + forceWait(1000); + mywait(advancedQuery); + click(advancedQuery); + sendKeys(skuNoQuery, Model.getSkuNo()); + click(query); + mywait(firstCheckBox); + click(firstCheckBox); + click(distribute); + mywait(confirm); + selectElement(selectManager, "林荣"); + click(confirm); + return new SkuCategoryManagerCongfigPage(driver); + } +} diff --git a/src/main/java/com/essa/pageObject/buyerManage/InvateCodePage.java b/src/main/java/com/essa/pageObject/buyerManage/InvateCodePage.java new file mode 100644 index 0000000..2542894 --- /dev/null +++ b/src/main/java/com/essa/pageObject/buyerManage/InvateCodePage.java @@ -0,0 +1,69 @@ +package com.essa.pageObject.buyerManage; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; +import com.essa.framework.Model; + +/** + * @author Administrator + *邀请码生成页面 + */ +public class InvateCodePage extends BasePage { + public InvateCodePage(WebDriver driver) { + super(driver); + } + /* + * 元素定位 + */ + + //第一个业务员复选框 + @FindBy(xpath ="//*[text()='选择人员']/../div/dl/dd[1]/b/input") + WebElement firstCheckbox; + + //推广方式 + @FindBy (xpath="//select[contains(@ng-change,'changeChannelList')]") + WebElement spreadForm; + + //推广渠道 + @FindBy (xpath="//select[@ng-model='parame.create.promoteChannelId']") + WebElement spreadChannel; + + //生成 + @FindBy (xpath="//button[contains(text(),'生成')]") + WebElement create; + + //确认 + @FindBy (xpath ="//*[text()='确认']") + WebElement confirm; + + //关闭 + @FindBy (xpath ="//*[text()='关闭']") + WebElement close; + + //生成的邀请码 + @FindBy (xpath="//tbody[@class='ng-scope']/tr[1]/td[5]") + WebElement invateCode; + + /* + * 页面方法 + */ + /** + * 生成邀请码 + */ + public void generateCode() { + mywait(firstCheckbox); + click(firstCheckbox); + selectElement(spreadForm, "搜索引擎"); + selectElement(spreadChannel, "Google"); + click(create); + forceWait(500); + click(confirm); + forceWait(500); + click(close); + String code = invateCode.getText(); + Model.setInvateCode(code); + } +} diff --git a/src/main/java/com/essa/pageObject/inquiryManage/ProductInquiryFeedbackPage.java b/src/main/java/com/essa/pageObject/inquiryManage/ProductInquiryFeedbackPage.java new file mode 100644 index 0000000..4020bf8 --- /dev/null +++ b/src/main/java/com/essa/pageObject/inquiryManage/ProductInquiryFeedbackPage.java @@ -0,0 +1,113 @@ +package com.essa.pageObject.inquiryManage; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; +import com.essa.framework.Model; + +/** + * @author Administrator 成品询价反馈页 + */ +public class ProductInquiryFeedbackPage extends BasePage { + public ProductInquiryFeedbackPage(WebDriver driver) { + super(driver); + } + + /* + * 元素定位 + */ + // 查询类型 + @FindBy(xpath = "//*[@ng-change='changeSearchType()']") + WebElement searchType; + + // 查询条件输入框 + @FindBy(xpath = "//*[@placeholder='请输入查询条件']") + WebElement searchText; + + // 查询按钮 + @FindBy(xpath = "//button[@ng-click='getFeedbackDetailBySearchInfo()']") + WebElement search; + + // 单箱金额 + @FindBy(xpath = "//*[contains(text(),'单箱金额')]") + WebElement singlePrice; + + // 待反馈任务 + @FindBy(xpath = "//*[contains(text(),'待反馈任务')]") + WebElement waitFeedback; + + // 提交审核 + @FindBy(xpath = "//*[@ng-click='submitFeedback(1)']") + WebElement submit; + + /* + * 页面方法 + */ + /** + * 提交询价任务 + * + * @return ProductInquiryTask + */ + public ProductInquiryTaskPage submit() { + // 根据单箱价格是否为空来判断页面是否加载成功 + for (int count = 0;"单箱金额:".equals(getText(singlePrice))&& count < 7;count++) { + forceWait(1000); + } + selectElement(searchType, "商品编号"); + sendKeys(searchText, Model.getSkuNo()); + // 根据sku编号来判断是否加载出想要的sku信息 + click(search); +// boolean b = isVisibility(By.xpath("//*[contains(text(),'" + Model.getSkuNo() + "')]")); +// while (!b) { +// forceWait(1000); +// } + dynamicWait(By.xpath("//*[contains(text(),'" + Model.getSkuNo() + "')]")); + click(waitFeedback); + // 判断是否加载待反馈视图 +// boolean b1 = isVisibility(By.xpath("//*[contains(text(),'询价要求完成时间')]")); +// while (!b1) { +// forceWait(1000); +// } + dynamicWait(By.xpath("//*[contains(text(),'询价要求完成时间')]")); + moveHeightScroll("100"); + click(submit); + return new ProductInquiryTaskPage(driver); + } + + /** + * 根据PO单,询价 + * @return + */ + public ProductInquiryTaskPage POsubmit() { + // 根据单箱价格是否为空来判断页面是否加载成功 + for (int count=0;"单箱金额:".equals(getText(singlePrice))&&count<7;count++) { + forceWait(1000); + } + selectElement(searchType, "来源PO单/成品采购单号"); + sendKeys(searchText, Model.getPoNum()); + click(search); +// while (!(isVisibility(By.xpath("//*[@id='mask' and @style='display: none;']")))) { +// forceWait(1000); +// } + dynamicLoad(By.xpath("//*[@id='mask' and @style='display: none;']")); + forceWait(1000); + click(waitFeedback); + dynamicWait(By.xpath("//*[contains(text(),'询价要求完成时间')]")); + moveHeightScroll("100"); + toSubmit(); + return new ProductInquiryTaskPage(driver); + } + + /** + * 如果【提交审核】在页面中存在,则一直点击,最多等7秒 + */ + private void toSubmit() { + for (int count =0;isVisibility(By.xpath("//*[@ng-click='submitFeedback(1)']"))&&count<7;count++) { + click(submit); + forceWait(1000); + } + } +} diff --git a/src/main/java/com/essa/pageObject/inquiryManage/ProductInquiryTaskPage.java b/src/main/java/com/essa/pageObject/inquiryManage/ProductInquiryTaskPage.java new file mode 100644 index 0000000..a252036 --- /dev/null +++ b/src/main/java/com/essa/pageObject/inquiryManage/ProductInquiryTaskPage.java @@ -0,0 +1,121 @@ +package com.essa.pageObject.inquiryManage; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; +import com.essa.framework.Model; + +/** + * @author Administrator 成品询价任务列表 + */ +public class ProductInquiryTaskPage extends BasePage { + public ProductInquiryTaskPage(WebDriver driver) { + super(driver); + } + + /* + * 元素定位 + */ + // 高级查询 + @FindBy(xpath = "//*[contains(text(),'高级查询')]") + WebElement advancedQuery; + + // 商品编码查询 + @FindBy(xpath = "//*[text()='商品编码']/../div/input") + WebElement skuNoQuery; + + // 根据PO查询 + @FindBy(xpath = "//*[text()='来源单号']/../div[1]/input") + WebElement POQuery; + + // 高级查询-查询按钮 + @FindBy(xpath = "//*[@name='advSearch']/div[12]/button[1]") + WebElement search; + + // 列表第一行数据 + @FindBy(xpath = "//*[@ng-table='tableParams1']/tbody/tr[1]") + WebElement firstRow; + + // 询价反馈 + @FindBy(xpath = "//*[contains(text(),'询价反馈')]") + WebElement feedBack; + + // 暂无数据--用于检查是否已经成功 + @FindBy(xpath = "//*[text()='暂无数据']") + WebElement isSucceed; + + /* + * 页面方法 + */ + /** + * 查出要成品询价的商品,进入成品询价反馈页面 + * + * @return ProductInquiryFeedback + */ + public ProductInquiryFeedbackPage toFeedback() { +// mywait(firstRow); + click(advancedQuery); + sendKeys(skuNoQuery, Model.getSkuNo()); + click(search); + mywait(firstRow); + click(firstRow); + click(feedBack); + return new ProductInquiryFeedbackPage(driver); + } + + /** + * 判断页面是否查询不到该商品 + * + * @return boolean + */ + public boolean isSucceed() { + click(advancedQuery); + sendKeys(skuNoQuery, Model.getSkuNo()); + click(search); + forceWait(1000); + return isVisibility(By.xpath("//*[text()='暂无数据']")); + } + + /** + * 判断根据po单查询,是否全部询价完成 + * + * @return boolean + */ + public boolean isPOSucceed() { + forceWait(1000); + return isVisibility(By.xpath("//*[@ng-table='tableParams1']/tbody/tr[1]")); + } + + /** + * 根据PO单号查询询价 + * + * @return 询价反馈页面 + */ + public ProductInquiryFeedbackPage POtoFeedback() { + dynamicWait(By.xpath("//*[@ng-table='tableParams1']/tbody/tr[1]")); + click(advancedQuery); + sendKeys(POQuery, Model.getPoNum()); + click(search); + dynamicWait(By.xpath("//*[@id='mask' and @style='display: none;']")); +// dynamicWait(By.xpath("//*[@ng-table='tableParams1']/tbody/tr[1]")); +// mywait(firstRow); +// forceWait(2000); + click(firstRow); + click(feedBack); + return new ProductInquiryFeedbackPage(driver); + } + + /** + * 如果列表中还存在待询价的单,循环方法,继续询价 + * + * @return + */ + public ProductInquiryFeedbackPage POcircle() { + click(firstRow); + click(feedBack); + return new ProductInquiryFeedbackPage(driver); + } +} diff --git a/src/main/java/com/essa/pageObject/marketingManage/CollectBillControlPage.java b/src/main/java/com/essa/pageObject/marketingManage/CollectBillControlPage.java new file mode 100644 index 0000000..2a9f18f --- /dev/null +++ b/src/main/java/com/essa/pageObject/marketingManage/CollectBillControlPage.java @@ -0,0 +1,15 @@ +package com.essa.pageObject.marketingManage; + +import org.openqa.selenium.WebDriver; + +import com.essa.framework.BasePage; + +/** + * @author Administrator + *集单控制 + */ +public class CollectBillControlPage extends BasePage { + public CollectBillControlPage(WebDriver driver) { + super(driver); + } +} diff --git a/src/main/java/com/essa/pageObject/marketingManage/CollectBillSettingPage.java b/src/main/java/com/essa/pageObject/marketingManage/CollectBillSettingPage.java new file mode 100644 index 0000000..6140d3f --- /dev/null +++ b/src/main/java/com/essa/pageObject/marketingManage/CollectBillSettingPage.java @@ -0,0 +1,223 @@ +package com.essa.pageObject.marketingManage; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; +import com.essa.framework.Model; + +/** + * @author Administrator + *集单设置 + */ +public class CollectBillSettingPage extends BasePage { + public CollectBillSettingPage(WebDriver driver) { + super(driver); + } + /* + * 元素定位 + */ + + //添加商品-查询输入框 + @FindBy (xpath = "//*[@name='keyword']") + WebElement searchContent; + + //团购设置中的关键字输入框 + @FindBy (xpath="//*[@ng-model='searchKeyword']") + WebElement content; + + //查询按钮 + @FindBy (xpath = "//button[@ng-click='gotoSearch()']") + WebElement search; + + //添加商品 + @FindBy (xpath = "//*[text()='添加商品']") + WebElement addSku; + + //loading,判断是否加载完成 + @FindBy (xpath="//*[@class='loading ng-scope']") + WebElement loading; + + //查询列表中的第一个复选框 + @FindBy (xpath = "//*[@class='table marketing-collectbill-products']/tbody/tr[1]/td[1]/input") + WebElement firstCheckBox; + + //MOQ设置 + @FindBy (xpath = "//*[text()='MOQ设置']") + WebElement MOQSet; + + //阶梯价 + @FindBy (xpath = "//*[text()='阶梯价']") + WebElement setPrice; + + //配置主推市场 + @FindBy (xpath = "//*[text()='配置主推市场']") + WebElement mainMarket; + + //发布商品 + @FindBy (xpath = "//*[text()='发布商品']") + WebElement publishSku; + + //添加商品-查询按钮 + @FindBy (xpath = "//*[@ng-click='search(false)']") + WebElement addSkuSearch; + + //添加商品-展开商品信息 + @FindBy (xpath = "//*[contains(@class,'fa fa-angle-double-dow')]") + WebElement showSku; + + //添加商品-搜索结果复选框 + @FindBy (xpath = "//*[@ng-repeat='list in item.skus']/tbody/tr[1]/td[1]/input") + WebElement skuCheckbox; + + //确定按钮 + @FindBy (xpath = "//*[contains(text(),'确定')]") + WebElement confirm; + + //活动成功MOQ + @FindBy (xpath = "//*[@ng-model='activitySuccessMoq']") + WebElement successMoq; + + //活动销售MOQ + @FindBy (xpath = "//*[@ng-model='activitySaleMoq']") + WebElement saleMoq; + + //成本价格 + @FindBy (xpath = "//*[contains(text(),'成本')]") + WebElement firstCost; + + //最低价 + @FindBy (xpath = "//*[@ng-model='minPrice']") + WebElement minPrice; + + //最高价 + @FindBy (xpath = "//*[@ng-model='maxPrice']") + WebElement maxPrice; + + //阶梯数 + @FindBy (xpath = "//*[@ng-model='ladderCount']") + WebElement ladderCount; + + //生成阶梯 + @FindBy (xpath = "//*[text()='生成阶梯']") + WebElement creatLadder; + + //可选区域-东欧 + @FindBy (xpath = "//*[contains(text(),'可选择的市场区域')]/../dd/span[1]/input") + WebElement easternEurope; + + //可选区域-南美 + @FindBy (xpath = "//*[contains(text(),'可选择的市场区域')]/../dd/span[2]/input") + WebElement southAmerican; + + //可选区域-欧美 + @FindBy (xpath = "//*[contains(text(),'可选择的市场区域')]/../dd/span[3]/input") + WebElement europeAndAmerica; + + //可选区域-东南亚 + @FindBy (xpath = "//*[contains(text(),'可选择的市场区域')]/../dd/span[4]/input") + WebElement southeastAsia; + + //可选区域-中东 + @FindBy (xpath = "//*[contains(text(),'可选择的市场区域')]/../dd/span[5]/input") + WebElement middleEast; + + /* + * 页面方法 + */ + /** + * 添加商品 + */ + public void addSku() { + mywait(addSku); + click(addSku); + /*while (isVisibility(By.xpath("//*[@class='loading ng-scope']"))) { + forceWait(1000); + };*/ + dynamicLoad(By.xpath("//*[@class='loading ng-scope']")); + sendKeys(searchContent, Model.getSkuNo()); + click(addSkuSearch); + forceWait(1000); + click(showSku); + click(skuCheckbox); + click(confirm); + } + + /** + * 设置MOQ + */ + public void setMoq() { + forceWait(1000); + mywait(firstCheckBox); + sendKeys(content, Model.getSkuNo()); + click(search); + mywait(firstCheckBox); + click(firstCheckBox); + click(MOQSet); +//===================================================================此处要修改 + sendKeys(successMoq, "150"); + sendKeys(saleMoq, "15"); + click(confirm); + } + /** + * 设置阶梯价 + */ + public void setPrice() { + forceWait(1000); + click(setPrice); + mywait(creatLadder); + int firstCost = getFirstCost(); + sendKeys(minPrice, firstCost+30+""); + sendKeys(maxPrice, firstCost+100+""); + sendKeys(ladderCount, "2"); + click(creatLadder); + forceWait(1000); + click(confirm); + } + /** + * 设置主推市场 + */ + public void setMarket() { + forceWait(1000); + click(mainMarket); + mywait(easternEurope); + click(easternEurope); + click(southAmerican); + click(easternEurope); + click(southeastAsia); + click(middleEast); + forceWait(500); + click(confirm); + forceWait(1000); + click(confirm); + } + + /** + * 组装以上操作 + * 添加商品并发布团购 + * @return GroupSettingPage + */ + public GroupSettingPage publishGroup() { + addSku(); + setMoq(); + setPrice(); + setMarket(); + forceWait(1000); + click(publishSku); + forceWait(1000); + click(confirm); + return new GroupSettingPage(driver); + } + + /** + * 获取到商品的成本价 + * @return price + */ + private int getFirstCost() { + String p = partialStr(firstCost.getText(), "成本:¥"); + int price = Integer.parseInt(p); + return price; + } +} diff --git a/src/main/java/com/essa/pageObject/marketingManage/GroupControlPage.java b/src/main/java/com/essa/pageObject/marketingManage/GroupControlPage.java new file mode 100644 index 0000000..a365a42 --- /dev/null +++ b/src/main/java/com/essa/pageObject/marketingManage/GroupControlPage.java @@ -0,0 +1,45 @@ +package com.essa.pageObject.marketingManage; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; +import com.essa.framework.Model; + +/** + * @author Administrator + *团购控制 + */ +public class GroupControlPage extends BasePage { + public GroupControlPage(WebDriver driver) { + super(driver); + } + /* + * 页面元素定位 + */ + + //关键字查询输入 + @FindBy (xpath = "//*[@ng-model='searchKeyword']") + WebElement searchKeyword; + + //查询按钮 + @FindBy (xpath = "//*[@ng-click='gotoSearch()']") + WebElement search; + + /* + * 页面方法 + */ + /** + * 判断团购的商品是否发布成功 + * @return boolean + */ + public boolean isSuccess() { + mywait(searchKeyword); + sendKeys(searchKeyword, Model.getSkuNo()); + click(search); + forceWait(1500); + return isVisibility(By.xpath("//*[contains(text(),'"+Model.getSkuNo()+"')]")); + } +} diff --git a/src/main/java/com/essa/pageObject/marketingManage/GroupSettingPage.java b/src/main/java/com/essa/pageObject/marketingManage/GroupSettingPage.java new file mode 100644 index 0000000..d1b1e2d --- /dev/null +++ b/src/main/java/com/essa/pageObject/marketingManage/GroupSettingPage.java @@ -0,0 +1,222 @@ +package com.essa.pageObject.marketingManage; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; +import com.essa.framework.Model; + +/** + * @author Administrator + *团购设置 + */ +public class GroupSettingPage extends BasePage { + public GroupSettingPage(WebDriver driver) { + super(driver); + } + /* + * 元素定位 + */ + + //添加商品-查询输入框 + @FindBy (xpath = "//*[@name='keyword']") + WebElement searchContent; + + //团购设置中的关键字输入框 + @FindBy (xpath="//*[@ng-model='searchKeyword']") + WebElement content; + + //查询按钮 + @FindBy (xpath = "//button[@ng-click='gotoSearch()']") + WebElement search; + + //添加商品 + @FindBy (xpath = "//*[text()='添加商品']") + WebElement addSku; + + //loading,判断是否加载完成 + @FindBy (xpath="//*[@class='loading ng-scope']") + WebElement loading; + + //查询列表中的第一个复选框 + @FindBy (xpath = "//*[@class='table marketing-collectbill-products']/tbody/tr[1]/td[1]/input") + WebElement firstCheckBox; + + //MOQ设置 + @FindBy (xpath = "//*[text()='MOQ设置']") + WebElement MOQSet; + + //阶梯价 + @FindBy (xpath = "//*[text()='阶梯价']") + WebElement setPrice; + + //配置主推市场 + @FindBy (xpath = "//*[text()='配置主推市场']") + WebElement mainMarket; + + //发布商品 + @FindBy (xpath = "//*[text()='发布商品']") + WebElement publishSku; + + //添加商品-查询按钮 + @FindBy (xpath = "//*[@ng-click='search(false)']") + WebElement addSkuSearch; + + //添加商品-展开商品信息 + @FindBy (xpath = "//*[contains(@class,'fa fa-angle-double-dow')]") + WebElement showSku; + + //添加商品-搜索结果复选框 + @FindBy (xpath = "//*[@ng-repeat='list in item.skus']/tbody/tr[1]/td[1]/input") + WebElement skuCheckbox; + + //确定按钮 + @FindBy (xpath = "//*[contains(text(),'确定')]") + WebElement confirm; + + //活动成功MOQ + @FindBy (xpath = "//*[@ng-model='activitySuccessMoq']") + WebElement successQoq; + + //活动销售MOQ + @FindBy (xpath = "//*[@ng-model='activitySaleMoq']") + WebElement saleQoq; + + //成本价格 + @FindBy (xpath = "//*[contains(text(),'成本')]") + WebElement firstCost; + + //最低价 + @FindBy (xpath = "//*[@ng-model='minPrice']") + WebElement minPrice; + + //最高价 + @FindBy (xpath = "//*[@ng-model='maxPrice']") + WebElement maxPrice; + + //阶梯数 + @FindBy (xpath = "//*[@ng-model='ladderCount']") + WebElement ladderCount; + + //生成阶梯 + @FindBy (xpath = "//*[text()='生成阶梯']") + WebElement creatLadder; + + //可选区域-东欧 + @FindBy (xpath = "//*[contains(text(),'可选择的市场区域')]/../dd/span[1]/input") + WebElement easternEurope; + + //可选区域-南美 + @FindBy (xpath = "//*[contains(text(),'可选择的市场区域')]/../dd/span[2]/input") + WebElement southAmerican; + + //可选区域-欧美 + @FindBy (xpath = "//*[contains(text(),'可选择的市场区域')]/../dd/span[3]/input") + WebElement europeAndAmerica; + + //可选区域-东南亚 + @FindBy (xpath = "//*[contains(text(),'可选择的市场区域')]/../dd/span[4]/input") + WebElement southeastAsia; + + //可选区域-中东 + @FindBy (xpath = "//*[contains(text(),'可选择的市场区域')]/../dd/span[5]/input") + WebElement middleEast; + + /* + * 页面方法 + */ + /** + * 添加商品 + */ + public void addSku() { + mywait(addSku); + click(addSku); + /*while (isVisibility(By.xpath("//*[@class='loading ng-scope']"))) { + forceWait(1000); + };*/ + dynamicLoad(By.xpath("//*[@class='loading ng-scope']")); + sendKeys(searchContent, Model.getSkuNo()); + click(addSkuSearch); + forceWait(1000); + click(showSku); + click(skuCheckbox); + click(confirm); + } + + /** + * 设置MOQ + */ + public void setMoq() { + forceWait(1000); + mywait(firstCheckBox); + sendKeys(content, Model.getSkuNo()); + click(search); + mywait(firstCheckBox); + click(firstCheckBox); + click(MOQSet); + sendKeys(successQoq, "150"); + sendKeys(saleQoq, "15"); + click(confirm); + } + /** + * 设置阶梯价 + */ + public void setPrice() { + forceWait(1000); + click(setPrice); + mywait(creatLadder); + int firstCost = getFirstCost(); + sendKeys(minPrice, firstCost+30+""); + sendKeys(maxPrice, firstCost+100+""); + sendKeys(ladderCount, "2"); + click(creatLadder); + forceWait(1000); + click(confirm); + } + /** + * 设置主推市场 + */ + public void setMarket() { + forceWait(1000); + click(mainMarket); + mywait(easternEurope); + click(easternEurope); + click(southAmerican); + click(easternEurope); + click(southeastAsia); + click(middleEast); + forceWait(500); + click(confirm); + forceWait(1000); + click(confirm); + } + + /** + * 组装以上操作 + * 添加商品并发布团购 + * @return GroupSettingPage + */ + public GroupSettingPage publishGroup() { + addSku(); + setMoq(); + setPrice(); + setMarket(); + forceWait(1000); + click(publishSku); + forceWait(1000); + click(confirm); + return new GroupSettingPage(driver); + } + + /** + * 获取到商品的成本价 + * @return price + */ + private int getFirstCost() { + String p = partialStr(firstCost.getText(), "成本:¥"); + int price = Integer.parseInt(p); + return price; + } +} diff --git a/src/main/java/com/essa/pageObject/needDealt/NeedDealtApplyPage.java b/src/main/java/com/essa/pageObject/needDealt/NeedDealtApplyPage.java new file mode 100644 index 0000000..849cf3c --- /dev/null +++ b/src/main/java/com/essa/pageObject/needDealt/NeedDealtApplyPage.java @@ -0,0 +1,171 @@ +package com.essa.pageObject.needDealt; + +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; +import com.essa.framework.Model; +import com.essa.pageObject.HomePage; + +/** + * 当团购活动成功时,类目经理采购计划单申请页面 + * @author Administrator + * + */ +public class NeedDealtApplyPage extends BasePage { + + public NeedDealtApplyPage(WebDriver driver) { + super(driver); + } + + /* + * 元素定位 + */ + + //提交询价 + @FindBy (xpath ="//*[text()='提交询价']") + WebElement submitInquiry; + + //待办工作--检查点 + @FindBy (xpath = "//*[contains(text(),'待办工作')]") + WebElement checkpoint; + + //流水号 + @FindBy (xpath = "//*[contains(text(),'流水号:RW')]") + WebElement serialNumber; + + //确认 + @FindBy (xpath = "//*[text()='确认']") + WebElement confirm; + + //送审核 + @FindBy (xpath = "//*[text()='提交审核']") + WebElement toAudit; + + //认领 + @FindBy (xpath = "//*[text()='认领']") + WebElement claim; + + //同意 + @FindBy (xpath ="//*[text()='同意']") + WebElement agree; + + //添加 + @FindBy(xpath = "//*[text()='添加']" ) + WebElement add; + + //船公司 + @FindBy(xpath = "//input[@name='shipperCompany']") + WebElement inputShipperCompany; + + //开船日期 + @FindBy(xpath = "//input[@id='deliveryDate0']") + WebElement inputShipperStartDate; + + //预计到港日期 + @FindBy(xpath = "//input[@id='estimatedArrivalDate0']") + WebElement inputShipperArriveDate; + + //提交 + @FindBy(xpath = "//*[text()='提交']") + WebElement submit; + + //暂存 + @FindBy(xpath = "//*[text()='暂存']") + WebElement save; + + + /* + * 页面方法 + */ + + /** + * 提交询价 + * @return bmps首页 + */ + public HomePage submitInquiry() { + mywait(checkpoint); + forceWait(1000); + Model.setSerialNum(partialStr(serialNumber.getText(), "流水号:")); + moveHeightScroll("100"); + click(submitInquiry); + forceWait(500); + click(confirm); + dynamicLoad(By.xpath("//*[style='display: block;']")); + return new HomePage(driver); + } + + /** + * 类目经理修订,送审核 + * @return bpms首页 + */ + public HomePage toAudit() { + mywait(checkpoint); + forceWait(1000); + moveHeightScroll("100"); + click(toAudit); + forceWait(500); + click(confirm); + dynamicLoad(By.xpath("//*[style='display: block;']")); + return new HomePage(driver); + } + + /** + * 财务审核计划申请 + * @return + */ + public HomePage audit() { + mywait(checkpoint); + forceWait(1000); + moveHeightScroll("100"); + click(claim); + mywait(checkpoint); + moveHeightScroll("100"); + click(agree); + click(confirm); + dynamicLoad(By.xpath("//*[style='display: block;']")); + return new HomePage(driver); + } + + public HomePage confirmSailingDate() { + mywait(checkpoint); + forceWait(1000); + Model.setSerialNum(partialStr(serialNumber.getText(), "流水号:")); + click(confirm); + return new HomePage(driver); + } + + /** + * 认领船务登记船期待办 + * @return 首页 + */ + public HomePage toClaimShippingMark(){ + + mywait(checkpoint); + forceWait(5000); + if(isVisibility(By.xpath("//*[text()='认领']"))){ + moveHeightScroll("100"); + click(claim); + } + forceWait(3000); + mywait(checkpoint); + click(add); + sendKeys(inputShipperCompany,"essa"); + //设置开船日期 + jsExecutorRemoveAttribute(inputShipperStartDate,"readonly"); + inputShipperStartDate.clear(); + sendKeys(inputShipperStartDate,"10/25/2018"); + //设置预计到港日期 + jsExecutorRemoveAttribute(inputShipperArriveDate,"readonly"); + inputShipperArriveDate.clear(); + sendKeys(inputShipperArriveDate,"11/10/2018"); + //提交 + click(submit); + return new HomePage(driver); + } + + +} diff --git a/src/main/java/com/essa/pageObject/productDev/AddProjectPage.java b/src/main/java/com/essa/pageObject/productDev/AddProjectPage.java new file mode 100644 index 0000000..64f5d8b --- /dev/null +++ b/src/main/java/com/essa/pageObject/productDev/AddProjectPage.java @@ -0,0 +1,75 @@ +package com.essa.pageObject.productDev; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import com.essa.framework.BasePage; + +/** + * @author Administrator + *新增项目立项书 + */ +public class AddProjectPage extends BasePage { + public AddProjectPage(WebDriver driver) { + super(driver); + } + /* + * 元素定位 + */ + //改版类型 + @FindBy (xpath ="//*[@dic-list='改版类型']") + WebElement revisonType; + + //项目名称 + @FindBy (xpath ="//*[@ng-model='model.name']") + WebElement projectName; + + //项目负责人 + @FindBy (xpath ="//*[@ng-model='model.leaderId']/input") + WebElement projectLeader; + + //项目负责人-林荣 + @FindBy (xpath ="//*[@id='role-user-select-box']/ul/li[3]/span") + WebElement linrong; + + //开发程度 + @FindBy (xpath ="//*[@dic-list='开发程度']") + WebElement devLevel; + + //开发系列 + @FindBy (xpath ="//*[@ng-model='model.serialId']") + WebElement devSerial; + + //团队成员-新增 + @FindBy (xpath ="//button[text()='新增']") + WebElement addMember; + + //任务处理人 -第一个 + @FindBy (xpath ="//*[@class='col-md-14']/table/tbody/tr[1]/td[2]/div/input") + WebElement Transactor1; + + //处理人-linrong + @FindBy (xpath ="//*[@id='role-user-select-box']/ul/li[3]/span") + WebElement linrong1; + + //任务处理人 -第二个 + @FindBy (xpath ="//*[@class='col-md-14']/table/tbody/tr[2]/td[2]/div/input") + WebElement Transactor2; + + //成员角色 -第一个 + @FindBy (xpath ="//*[@class='col-md-14']/table/tbody/tr[1]/td[3]/select") + WebElement role1; + + //成员角色 -第二个 + @FindBy (xpath ="//*[@class='col-md-14']/table/tbody/tr[2]/td[3]/select") + WebElement role2; + + //选择改版商品信息 + @FindBy (xpath ="//*[text()='选择']") + WebElement selectGoods; + + //保存 + @FindBy (xpath ="//*[contains(text(),'保存')]") + WebElement save; +} diff --git a/src/main/java/com/essa/testSuite/SendEmail.java b/src/main/java/com/essa/testSuite/SendEmail.java new file mode 100644 index 0000000..aec2d62 --- /dev/null +++ b/src/main/java/com/essa/testSuite/SendEmail.java @@ -0,0 +1,113 @@ +package com.essa.testSuite; + +import java.util.Properties; + +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.activation.FileDataSource; +import javax.mail.BodyPart; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.PasswordAuthentication; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; + +public class SendEmail { + + public static void main(String[] args) { + + // 创建一个Property文件对象 + Properties props = new Properties(); + + // 设置邮件服务器的信息,这里设置smtp主机名称 + props.put("mail.smtp.host", "smtp.qq.com"); + + // 设置socket factory 的端口 + props.put("mail.smtp.socketFactory.port", "465"); + + // 设置socket factory + props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory"); + + // 设置需要身份验证 + props.put("mail.smtp.auth", "true"); + + // 设置SMTP的端口,QQ的smtp端口是25 + props.put("mail.smtp.port", "25"); + + // 身份验证实现 + Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { + + protected PasswordAuthentication getPasswordAuthentication() { + // 第二个参数,就是我QQ开启smtp的授权码 + return new PasswordAuthentication("278953238@qq.com", "pfpzqcamljytbjec"); + + } + + }); + + try { + + // 创建一个MimeMessage类的实例对象 + Message message = new MimeMessage(session); + + // 设置发件人邮箱地址 + message.setFrom(new InternetAddress("278953238@qq.com")); + + // 设置收件人邮箱地址 + message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("3289714863@qq.com")); + + // 设置邮件主题 + message.setSubject("测试发送邮件"); + + // 创建一个MimeBodyPart的对象,以便添加内容 + BodyPart messageBodyPart1 = new MimeBodyPart(); + + // 设置邮件正文内容 + messageBodyPart1.setText("这个是邮件的正文部分"); + + // 创建另外一个MimeBodyPart对象,以便添加其他内容 + MimeBodyPart messageBodyPart2 = new MimeBodyPart(); + + // 设置邮件中附件文件的路径 + String filename = ".\\test-output\\emailable-report.html"; + + // 创建一个datasource对象,并传递文件 + DataSource source = new FileDataSource(filename); + + // 设置handler + messageBodyPart2.setDataHandler(new DataHandler(source)); + + // 加载文件 + messageBodyPart2.setFileName(filename); + + // 创建一个MimeMultipart类的实例对象 + Multipart multipart = new MimeMultipart(); + + // 添加正文1内容 + multipart.addBodyPart(messageBodyPart1); + + // 添加正文2内容 + multipart.addBodyPart(messageBodyPart2); + + // 设置内容 + message.setContent(multipart); + + // 最终发送邮件 + Transport.send(message); + + System.out.println("=====邮件已经发送====="); + + } catch (MessagingException e) { + + throw new RuntimeException(e); + + } + + } + +} diff --git a/src/main/java/com/essa/testSuite/TestActivity.java b/src/main/java/com/essa/testSuite/TestActivity.java new file mode 100644 index 0000000..4df723d --- /dev/null +++ b/src/main/java/com/essa/testSuite/TestActivity.java @@ -0,0 +1,100 @@ +package com.essa.testSuite; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.testng.asserts.SoftAssert; + +import com.essa.framework.Model; +import com.essa.pageObject.BaseTest; +import com.essa.pageObject.HomePage; +import com.essa.pageObject.inquiryManage.ProductInquiryFeedbackPage; +import com.essa.pageObject.inquiryManage.ProductInquiryTaskPage; +import com.essa.pageObject.needDealt.NeedDealtApplyPage; + +public class TestActivity extends BaseTest{ + public WebDriver driver; +// private String manager; + + @BeforeClass + public void setUp() { + initsetUp(); +// Model.setIsactivity(1); +// Model.setManager("linrong"); + } + + @AfterClass + public void tearDown() { + driver.quit(); + } + + /** + * 活动商品已满足,类目经理走待办 + */ + @Test(description="采购计划单申请,送询价") + public void TestActivityToPO() { + this.driver = getDriver(); +// this.manager = Model.getManager(); + if (Model.getManager() == null) { + System.out.println("获取类目经理失败了"); + driver.quit(); + } + + loginValid(Model.getManager()); + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.applyPurchasePlane();//目前没办法查出待办流水号,只能点击第一个待办,此处后续有必要的话需要优化 + NeedDealtApplyPage needDealtApplyPage = PageFactory.initElements(driver, NeedDealtApplyPage.class); + needDealtApplyPage.submitInquiry(); + } + + /** + * chenhong对成品询价,目前写死,暂不考虑义务商品 + */ + @Test(description="成品询价") + public void productInquiry() { + this.driver = getDriver(); + loginValid("chenhong");//此处是汕头的商品,有可能出现义务的商品,则要用xingchangyong来操作 + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.toProductInquiryTask(); + ProductInquiryTaskPage productInquiryTask = PageFactory.initElements(driver, ProductInquiryTaskPage.class); + productInquiryTask.toFeedback(); + ProductInquiryFeedbackPage productInquiryFeedback = PageFactory.initElements(driver, + ProductInquiryFeedbackPage.class); + productInquiryFeedback.submit(); + // 断言 + SoftAssert softAssert = new SoftAssert(); + softAssert.assertEquals(productInquiryTask.isSucceed(), true, "成品询价失败!"); + softAssert.assertAll(); + homePage.sureLogout(); + + } + + /** + * 类目经理对采购计划进行修订 + */ + @Test(description="采购计划修订") + public void planeModify() { + this.driver = getDriver(); + loginValid(Model.getManager()); + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.toNeedDealtDetailPage(); + NeedDealtApplyPage needDealtApplyPage = PageFactory.initElements(driver, NeedDealtApplyPage.class); + needDealtApplyPage.toAudit(); + homePage.logout(); + } + + /** + * 财务对采购计划进行审核 + */ + @Test(description="财务审核采购计划") + public void TestAuditApply() { + this.driver = getDriver(); + loginValid("wangchaomang"); + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.toNeedDealtDetailPage(); + NeedDealtApplyPage needDealtApplyPage = PageFactory.initElements(driver, NeedDealtApplyPage.class); + needDealtApplyPage.audit(); + } +} diff --git a/src/main/java/com/essa/testSuite/TestAddMarketGoods.java b/src/main/java/com/essa/testSuite/TestAddMarketGoods.java new file mode 100644 index 0000000..d8f5099 --- /dev/null +++ b/src/main/java/com/essa/testSuite/TestAddMarketGoods.java @@ -0,0 +1,86 @@ +package com.essa.testSuite; + +import java.io.IOException; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.testng.asserts.SoftAssert; + +import com.essa.framework.Model; +import com.essa.pageObject.BaseTest; +import com.essa.pageObject.HomePage; +import com.essa.pageObject.GoodsManage.AddMarketGoodsPage; +import com.essa.pageObject.GoodsManage.AuditMarketGoodsPage; +import com.essa.pageObject.GoodsManage.AuditMarketOpreatePage; +import com.essa.pageObject.GoodsManage.MarketGoodsRelesePage; + +/** + * @author Administrator + *测试用例:添加市场商品 + */ +public class TestAddMarketGoods extends BaseTest { + + WebDriver driver; + + @BeforeClass + public void setUp() throws IOException { + initsetUp(); + loginValid("maomeixiang"); + } + /** + * 进入市场商品发布页,选择对应的采购商 + */ + @Test(description="进入市场商品发布列表,选择采购商") + public void toMarketGoodsRelesePage() { + this.driver = getDriver(); + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.toMarketGoodsRelesePage(); + MarketGoodsRelesePage marketGoodsRelesePage = PageFactory.initElements(driver, MarketGoodsRelesePage.class); + marketGoodsRelesePage.toAddMarketGoodsPage(); + } + /** + * 市场商品建档 + */ + @Test(description="市场商品建档") + public void addMarketGoods() { + this.driver = getDriver(); + AddMarketGoodsPage addMarketGoodsPage = PageFactory.initElements(driver, AddMarketGoodsPage.class); + addMarketGoodsPage.addMarketGoods(); + + //断言是否建档成功,如果model中的skuNo不为null则成功 + SoftAssert softAssert = new SoftAssert(); + boolean actual = !(Model.getSkuNo().isEmpty()); + softAssert.assertEquals(actual, true, "市场商品建档失败"); + softAssert.assertAll(); + + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.getHome(); + homePage.logout(); + } + /** + * 对市场商品进行审核 + */ + @Test(description="市场商品审核") + public void auditMarketGoods() { + loginValid("xingchangyong"); + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.toAuditMarketGoodsPage(); + AuditMarketGoodsPage auditMarketGoodsPage = PageFactory.initElements(driver, AuditMarketGoodsPage.class); + auditMarketGoodsPage.auditMarketGoods(); + AuditMarketOpreatePage auditMarketOpreatePage = PageFactory.initElements(driver, AuditMarketOpreatePage.class); + auditMarketOpreatePage.auditPass(); + //断言是否审核成功 + boolean actual = auditMarketGoodsPage.isSucceed(); + SoftAssert softAssert = new SoftAssert(); + softAssert.assertEquals(actual, false, "市场商品审核失败!"); + softAssert.assertAll(); + } + + @AfterClass + public void tearDown() { + driver.quit(); + } +} diff --git a/src/main/java/com/essa/testSuite/TestAddOriginalGoods.java b/src/main/java/com/essa/testSuite/TestAddOriginalGoods.java new file mode 100644 index 0000000..f637225 --- /dev/null +++ b/src/main/java/com/essa/testSuite/TestAddOriginalGoods.java @@ -0,0 +1,117 @@ +package com.essa.testSuite; + +import java.io.IOException; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.testng.asserts.SoftAssert; + +import com.essa.pageObject.BaseTest; +import com.essa.pageObject.HomePage; +import com.essa.pageObject.GoodsManage.AddOriginalGoodsPage; +import com.essa.pageObject.GoodsManage.AuditOriginalGoodsPage; +import com.essa.pageObject.GoodsManage.AuditOriginalOpreatePage; +import com.essa.pageObject.GoodsManage.GoodsBankPage; +import com.essa.pageObject.GoodsManage.GoodsRelesePage; +import com.essa.pageObject.GoodsManage.UpdatePicPage; + +/** + * @author Administrator + *测试用例:天机原厂商品 + */ +public class TestAddOriginalGoods extends BaseTest { + + WebDriver driver; + + @BeforeClass + public void setUp() throws IOException { + initsetUp(); + loginValid("linxun"); + } + + /** + * 商品建档 + * + * @throws InterruptedException + */ + @Test(description="原厂商品建档") + public void toAddOriginalGoodsPage() throws InterruptedException { + this.driver = getDriver(); + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.tOriginalGoodsPage(); + AddOriginalGoodsPage addOriginalGoodsPage = PageFactory.initElements(driver, AddOriginalGoodsPage.class); + addOriginalGoodsPage.addOriginalGoods(); + + } + + /** + * 更新商品图片 + * + * @throws Exception + * @throws InterruptedException + */ + @Test(description="更新图片") + public void updatePic() throws Exception { + this.driver = getDriver(); + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.tGoodsRelesePage(); + GoodsRelesePage goodsRelesePage = PageFactory.initElements(driver, GoodsRelesePage.class); + + //断言上一步商品建档是否成功 + boolean actual = goodsRelesePage.isAddOrignalSucceed(); + SoftAssert assertion = new SoftAssert(); + assertion.assertEquals(actual, true, "商品建档失败!"); + assertion.assertAll(); + + goodsRelesePage.toUpDatePic(); + UpdatePicPage updatePicPage = PageFactory.initElements(driver, UpdatePicPage.class); + // 传入要上传的图片的本机地址 +// updatePicPage.upDatePic("C:\\Users\\Administrator\\Pictures\\Camera Roll\\4.jpg"); + updatePicPage.upDatePic(); + } + + /** + * 审核原厂商品 + */ + @Test(description="原厂商品审核") + public void auditOriginal() { + this.driver = getDriver(); + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.toAuditOriginalGoodsPage(); + AuditOriginalGoodsPage auditOriginalGoodsPage = PageFactory.initElements(driver, AuditOriginalGoodsPage.class); + // 断言上一步更新图片是否成功 + boolean actual1 = auditOriginalGoodsPage.isSucceed(); + SoftAssert assertion = new SoftAssert(); + assertion.assertEquals(actual1, true, "更新图片失败!"); + + auditOriginalGoodsPage.toAuditOriginalSku(); + AuditOriginalOpreatePage auditOriginalOpreatePage = PageFactory.initElements(driver, + AuditOriginalOpreatePage.class); + auditOriginalOpreatePage.auditPass(); + + // 断言是否审核成功,如果发布审核页面没有找到刚刚的商品,说明审核成功了 + boolean actual = auditOriginalGoodsPage.isSucceed(); + assertion.assertEquals(actual, false, "审核原厂商品时失败!"); + assertion.assertAll(); + } + + /** + * 获取新增的商品编号 + */ + @Test(description="去商品库获取添加的sku编号") + public void getSkuNo() { + this.driver = getDriver(); + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.toGoodsBankPage(); + GoodsBankPage goodsBankPage = PageFactory.initElements(driver, GoodsBankPage.class); + goodsBankPage.getNo(); + } + + @AfterClass + public void tearDown() { + driver.quit(); + } +} diff --git a/src/main/java/com/essa/testSuite/TestDevelopmentAbility.java b/src/main/java/com/essa/testSuite/TestDevelopmentAbility.java new file mode 100644 index 0000000..b4cf4f6 --- /dev/null +++ b/src/main/java/com/essa/testSuite/TestDevelopmentAbility.java @@ -0,0 +1,124 @@ +package com.essa.testSuite; + +import static org.testng.Assert.assertEquals; + +import java.io.IOException; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.asserts.SoftAssert; + +import com.essa.pageObject.HomePage; +import com.essa.pageObject.SupplierOperationsTrackPage; +import com.essa.pageObject.SupplierStrengthPage; +import com.essa.pageObject.BaseTest; + +public class TestDevelopmentAbility extends BaseTest { + + WebDriver driver; + + // 登录 + @BeforeClass + public void setUp() throws IOException { + + initsetUp(); + + loginValid("admin"); + + } + + // 切换到“供应商管理”菜单 + @Test + public void toSupplierOperationsTrack() { + + /* + * 由于我们只能对一个driver进行操作,要先将driver获取 我们要操作的页面为HomePage,所以要初始化一个HomePage对象 + * 调用进入平台运营管理,断言 + */ + this.driver = getDriver(); + + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + + homePage.goToSupplierOperationsTrack(); + + assertEquals(homePage.isSearchSuppliers(), true, "切换到“供应商管理”菜单失败!"); + + } + + @Test(dataProvider = "suppliers", dependsOnMethods = { "toSupplierOperationsTrack" }) + public void editDevelopmentAbility(String supplier) throws Exception { + + SupplierOperationsTrackPage sotp = + PageFactory.initElements(driver, SupplierOperationsTrackPage.class); + SoftAssert softAssert = new SoftAssert(); + softAssert.assertEquals(sotp.isSucceed(), true, "进入平台运营跟进管理失败!"); + + sotp.goToSupplierStrengthPage(supplier); + SupplierStrengthPage strengthPage = + PageFactory.initElements(driver, SupplierStrengthPage.class); + softAssert.assertEquals(strengthPage.isSucceed(), true, "进入实力评估页面失败!"); + + /* + * 配合度选择“高”,主打产品:中高 + * 是否研发能力选择“是”,勾选:每个季度有新品推出,有配备工程师,产品研发团队,其他 + * 添加证书,服务过大客户 + * 点击提交 + */ + + strengthPage.selectCooperateDegree("高"); + Thread.sleep(500); + + strengthPage.selMainProduct("中高"); + Thread.sleep(500); + + strengthPage.isDevAblity("是"); + strengthPage.newProduct(); + strengthPage.haveEngineer(); + strengthPage.haveTeam(); + strengthPage.other(); + + strengthPage.addCertification(); + strengthPage.addSerLargeCus(); + + strengthPage.submit(); + Thread.sleep(1000); + + softAssert.assertEquals(strengthPage.isSubmit(), true, "提交失败!"); + + softAssert.assertAll(); + + strengthPage.alertClosed(); + + } + + + // 读取excel表格 表格位置在data文件夹下 表格名称为“供应商”,读取的sheet名称为“供应商” + @DataProvider(name = "suppliers") + public Object[][] suppliersData() { + + try { + + return com.essa.framework.BasePage.readExcel(".\\src\\main\\resources", "data.xlsx", "供应商"); + + } catch (Exception e) { + + e.printStackTrace(); + + return null; + + } + } + + // 测试完要清理,不占用资源 + + @AfterClass + public void tearDown() { + + driver.quit(); + + } +} diff --git a/src/main/java/com/essa/testSuite/TestGenrateCode.java b/src/main/java/com/essa/testSuite/TestGenrateCode.java new file mode 100644 index 0000000..0d00582 --- /dev/null +++ b/src/main/java/com/essa/testSuite/TestGenrateCode.java @@ -0,0 +1,45 @@ +package com.essa.testSuite; + +import java.io.IOException; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import com.essa.pageObject.BaseTest; +import com.essa.pageObject.HomePage; +import com.essa.pageObject.buyerManage.InvateCodePage; + +/** + * @author Administrator + *测试用例:生成邀请码 + */ +public class TestGenrateCode extends BaseTest { + +WebDriver driver; + + @BeforeClass + public void setUp() throws IOException { + initsetUp(); + loginValid("admin"); + } + + @AfterClass + public void tearDown() { + driver.quit(); + } + + /** + * 生成邀请码 + */ + @Test(description="生成采购商注册邀请码") + public void genrateCode() { + this.driver = getDriver(); + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.toInvateCodePage(); + InvateCodePage invateCodePage = PageFactory.initElements(driver, InvateCodePage.class); + invateCodePage.generateCode(); + } +} diff --git a/src/main/java/com/essa/testSuite/TestGroupPurchase.java b/src/main/java/com/essa/testSuite/TestGroupPurchase.java new file mode 100644 index 0000000..675a2fb --- /dev/null +++ b/src/main/java/com/essa/testSuite/TestGroupPurchase.java @@ -0,0 +1,75 @@ +package com.essa.testSuite; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.testng.asserts.SoftAssert; + +import com.essa.pageObject.BaseTest; +import com.essa.pageObject.HomePage; +import com.essa.pageObject.buyPlaneManage.SkuCategoryManagerCongfigPage; +import com.essa.pageObject.marketingManage.GroupControlPage; +import com.essa.pageObject.marketingManage.GroupSettingPage; + +/** + * @author Administrator + *测试用例:发布团购 + */ +public class TestGroupPurchase extends BaseTest { + + WebDriver driver; + + @BeforeClass + public void setUp() { + initsetUp(); + loginValid("linrong"); + } + + /** + * 配置商品类目经理 + */ + @Test(description="配置商品类目经理") + public void SkuCategoryManagerCongfig() { + this.driver = getDriver(); + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.toSkuCategoryManagerCongfig(); + SkuCategoryManagerCongfigPage skuCategoryManagerCongfigPage = PageFactory.initElements(driver, + SkuCategoryManagerCongfigPage.class); + skuCategoryManagerCongfigPage.distributeManager(); + } + + /** + * 发布团购商品 + */ + @Test(description="发布团购") + public void publishGroupPurchase() { + this.driver = getDriver(); + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.toGroupSettingPage(); + GroupSettingPage groupSettingPage = PageFactory.initElements(driver, GroupSettingPage.class); + groupSettingPage.publishGroup(); + } + + /** + * 进入团购控制,查找是否有发布成功,并进行断言 + */ + @Test(description="检查团购是否发布成功") + public void isPublish() { + this.driver = getDriver(); + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.toGroupControlPage(); + GroupControlPage groupControlPage = PageFactory.initElements(driver, GroupControlPage.class); + boolean actual = groupControlPage.isSuccess(); + SoftAssert softAssert = new SoftAssert(); + softAssert.assertEquals(actual, true, "发布团购失败了!"); + softAssert.assertAll(); + } + + @AfterClass + public void tearDown() { + driver.quit(); + } + +} diff --git a/src/main/java/com/essa/testSuite/TestLogin.java b/src/main/java/com/essa/testSuite/TestLogin.java new file mode 100644 index 0000000..1ed4d57 --- /dev/null +++ b/src/main/java/com/essa/testSuite/TestLogin.java @@ -0,0 +1,104 @@ +package com.essa.testSuite; + +import java.io.IOException; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.testng.asserts.SoftAssert; + +import com.essa.framework.BrowserEngine; +import com.essa.pageObject.HomePage; +import com.essa.pageObject.LoginPage; + +/** + * @author Administrator + *测试用例:登录测试 + */ +public class TestLogin { + WebDriver driver; + + /* + * 调用浏览器,打开网页 + * 执行任何测试之前都应执行这个步骤 + * 后面我会把这个方法封装在pageObject.function里面 + */ + + @BeforeClass + public void setUp() throws IOException { + + BrowserEngine browserEngine = new BrowserEngine(); + + browserEngine.initConfigData(); + + driver = browserEngine.getBrowser(); + + } + + /* + * 初始化(实例化)一个登录页面 + * 做登录操作 + * 登录完后会跳转到后台首页 + * 故要初始化一个后台首页用于断言是否登录成功 + * 这里登录成功的标识是有“退出”按钮 + */ + + @Test(dataProvider="users") + public void login(String account,String password) { + + LoginPage loginPage = PageFactory.initElements(driver, LoginPage.class); + + loginPage.login(account, password); + + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + + /* + * 软断言,即就算此用例失败,依然会继续执行 + * 断言后,做退出登录操作 + */ + + SoftAssert softAssert = new SoftAssert(); + + softAssert.assertEquals(homePage.isSucceed(), true, "登录失败!"); + + softAssert.assertAll(); + + homePage.logout(); + + } + + /* + * 提供数据对象 + * 此方法读取当前项目根目录下的data\\data.xlsx文件中的“users”工作表 + */ + + @DataProvider(name="users") + public Object[][] suppliersData() { + + try { + + return com.essa.framework.BasePage.readExcel(".\\src\\main\\resources", "data.xlsx", "users"); + + } catch (Exception e) { + + e.printStackTrace(); + + return null; + + } + } + + /* + * 最后要做清理工作,避免占用资源 + */ + + @AfterClass + public void tearDown() { + + driver.quit(); + + } +} diff --git a/src/main/java/com/essa/testSuite/TestNoticeReceiveAndLoad.java b/src/main/java/com/essa/testSuite/TestNoticeReceiveAndLoad.java new file mode 100644 index 0000000..131377c --- /dev/null +++ b/src/main/java/com/essa/testSuite/TestNoticeReceiveAndLoad.java @@ -0,0 +1,32 @@ +package com.essa.testSuite; + +import com.essa.pageObject.BaseTest; +import org.openqa.selenium.WebDriver; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +public class TestNoticeReceiveAndLoad extends BaseTest{ + + WebDriver driver; + + @BeforeClass + public void setUp(){ + initsetUp(); + loginValid("chenyijie"); + } + + @AfterClass + public void tearDown(){ + driver.quit(); + } + + /** + * 通知收货和通知装柜 + */ + @Test(description = "通知收货和通知装柜") + public void NoticeReceiveAndLoad(){ + this.driver = getDriver(); + + } +} diff --git a/src/main/java/com/essa/testSuite/TestPOInquiry.java b/src/main/java/com/essa/testSuite/TestPOInquiry.java new file mode 100644 index 0000000..9631726 --- /dev/null +++ b/src/main/java/com/essa/testSuite/TestPOInquiry.java @@ -0,0 +1,50 @@ +package com.essa.testSuite; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import com.essa.pageObject.BaseTest; +import com.essa.pageObject.HomePage; +import com.essa.pageObject.inquiryManage.ProductInquiryFeedbackPage; +import com.essa.pageObject.inquiryManage.ProductInquiryTaskPage; + +public class TestPOInquiry extends BaseTest { + + WebDriver driver; + + @BeforeClass + public void setUp() { + initsetUp(); + loginValid("chenhong"); + } + + @AfterClass + public void tearDown() { + driver.quit(); + } + + + /** + * po询价 + */ + @Test(description="根据PO单号,做询价操作") + public void POInquiry() { + this.driver = getDriver(); + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.toProductInquiryTask(); + ProductInquiryTaskPage productInquiryTask = PageFactory.initElements(driver, ProductInquiryTaskPage.class); + ProductInquiryFeedbackPage productInquiryFeedbackPage = PageFactory.initElements(driver, + ProductInquiryFeedbackPage.class); + productInquiryTask.POtoFeedback(); + productInquiryFeedbackPage.POsubmit(); + + //如果列表还有未询价,继续执行 + while (productInquiryTask.isPOSucceed()) { + productInquiryTask.POcircle(); + productInquiryFeedbackPage.POsubmit(); + } + } +} diff --git a/src/main/java/com/essa/testSuite/TestProductInquiry.java b/src/main/java/com/essa/testSuite/TestProductInquiry.java new file mode 100644 index 0000000..e5b1cb2 --- /dev/null +++ b/src/main/java/com/essa/testSuite/TestProductInquiry.java @@ -0,0 +1,51 @@ +package com.essa.testSuite; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.testng.asserts.SoftAssert; + +import com.essa.pageObject.BaseTest; +import com.essa.pageObject.HomePage; +import com.essa.pageObject.inquiryManage.ProductInquiryFeedbackPage; +import com.essa.pageObject.inquiryManage.ProductInquiryTaskPage; + +/** + * @author Administrator 测试用例:成品询价 + */ +public class TestProductInquiry extends BaseTest { + + WebDriver driver; + + @BeforeClass + public void setUp() { + initsetUp(); + loginValid("chenhong"); + } + + @AfterClass + public void tearDown() { + driver.quit(); + } + + /** + * 成品询价 + */ + @Test(description = "成品询价流程") + public void productInquiry() { + this.driver = getDriver(); + HomePage homePage = PageFactory.initElements(driver, HomePage.class); + homePage.toProductInquiryTask(); + ProductInquiryTaskPage productInquiryTask = PageFactory.initElements(driver, ProductInquiryTaskPage.class); + productInquiryTask.toFeedback(); + ProductInquiryFeedbackPage productInquiryFeedback = PageFactory.initElements(driver, + ProductInquiryFeedbackPage.class); + productInquiryFeedback.submit(); + // 断言 + SoftAssert softAssert = new SoftAssert(); + softAssert.assertEquals(productInquiryTask.isSucceed(), true, "成品询价失败!"); + softAssert.assertAll(); + } +} diff --git a/src/main/java/com/essa/testSuite/TestShippingMark.java b/src/main/java/com/essa/testSuite/TestShippingMark.java new file mode 100644 index 0000000..9886fa8 --- /dev/null +++ b/src/main/java/com/essa/testSuite/TestShippingMark.java @@ -0,0 +1,45 @@ +package com.essa.testSuite; + + +import com.essa.framework.BasePage; +import com.essa.pageObject.BaseTest; +import com.essa.pageObject.HomePage; +import com.essa.pageObject.needDealt.NeedDealtApplyPage; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.PageFactory; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; + +/** + * 测试用例:登记备选船期 + */ +public class TestShippingMark extends BaseTest{ + + WebDriver driver; + + @BeforeClass + public void setUp(){ + initsetUp(); + loginValid("wangmiaodan"); + } + + @AfterClass + public void tearDown(){ + driver.quit(); + } + + /** + * 登记备选船期 + */ + @org.testng.annotations.Test(description = "登记备选船期待办") + public void ShippingMarkWait(){ + this.driver = getDriver(); + + HomePage homePage = PageFactory.initElements(driver,HomePage.class); + homePage.toShippingMarkWait(); + NeedDealtApplyPage needDealtApplyPage = PageFactory.initElements(driver,NeedDealtApplyPage.class); + needDealtApplyPage.toClaimShippingMark(); + homePage.logout(); + } +} diff --git a/src/main/java/swing/SwingMain.java b/src/main/java/swing/SwingMain.java new file mode 100644 index 0000000..11e4b3e --- /dev/null +++ b/src/main/java/swing/SwingMain.java @@ -0,0 +1,701 @@ +package swing; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import java.awt.event.ActionListener; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.RandomAccessFile; +import java.io.StringReader; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.awt.event.ActionEvent; +import javax.swing.JTextField; + +import org.apache.xmlbeans.impl.xb.xsdschema.Public; +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; +import org.jdom.output.XMLOutputter; +import org.testng.TestNG; + +import com.essa.framework.BrowserEngine; +import com.essa.framework.Logger; +import com.essa.framework.Model; +import com.essa.pageObject.GoodsManage.AddOriginalGoodsPage; +import com.essa.pageObject.GoodsManage.GoodsBankPage; +import com.essa.pageObject.GoodsManage.UpdatePicPage; + +import javax.swing.JLabel; +import javax.swing.JRadioButton; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +import java.awt.Color; +import javax.swing.DefaultComboBoxModel; +import javax.swing.ImageIcon; +import java.awt.Toolkit; +import java.awt.BorderLayout; +import java.awt.Choice; +import java.awt.Font; +import java.awt.Graphics; + +import javax.swing.JList; +import javax.swing.JMenuBar; +import javax.swing.JTextPane; +import java.awt.event.InputMethodListener; +import java.awt.event.InputMethodEvent; +import java.beans.VetoableChangeListener; +import java.beans.PropertyChangeEvent; +import javax.swing.JPanel; +import java.beans.PropertyChangeListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import javax.swing.UIManager; +import java.awt.TextField; +import java.awt.Panel; +import javax.swing.JScrollBar; +import javax.swing.ScrollPaneConstants; +import javax.swing.SwingWorker; +import javax.swing.border.LineBorder; + +/** + * @author Administrator 图形化 + */ +public class SwingMain { + + private JFrame frmvBy; + private JTextField supplierName; + private JTextField buyerNo2; + public static String no; + private JTextField account; + private JTextArea SkuNo; + private JTextField password; + private JTextField registerAccount; + private JTextArea ja; + private JTextField po; + + private String buyerAccount;//采购商账号,存储于配置文件中,记录上一次使用的账号 + private String supplier;//供应商 + private String buyerNo;//采购商编号 + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + SwingMain window = new SwingMain(); + window.frmvBy.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public SwingMain() { + + initData(); + initialize(); + } + + /** + * 读取data.xml文件保存的用户使用的数据,用于读取该用户上一次输入的数据 + * @throws JDOMException + * @throws IOException + */ + public void initData() { + try { + SAXBuilder builder = new SAXBuilder(); + Document document = builder.build(new File(".\\resources\\data.xml")); + Element root = document.getRootElement(); + Element element = root.getChild("data"); + this.buyerAccount = element.getChildText("buyerAccount"); + this.supplier = element.getChildText("supplier"); + this.buyerNo = element.getChildText("buyerNo"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 将用户输入过的数据保存在data.xml文件中 + * @param key 字段名 + * @param value 参数值 + * @throws JDOMException + * @throws IOException + */ + public void setData(String key,String value) { + try { + SAXBuilder builder = new SAXBuilder(); + Document document = builder.build(new File(".\\resources\\data.xml")); + Element root = document.getRootElement(); + Element element = root.getChild("data"); + element.getChild(key).setText(value); + XMLOutputter XMLOut = new XMLOutputter(); + XMLOut.output(document,new FileOutputStream(".\\resources\\data.xml")); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 获取当前时间 + * @return + */ + public String getCurrentTime() { + SimpleDateFormat format = new SimpleDateFormat("[yyyy-MM-dd HH:mm:ss] "); + Date today = new Date(); + String time = format.format(today); + return time; + } + + /** + * frame初始化. + */ + private void initialize() { + frmvBy = new JFrame("ESSA自动化测试工具v1.0.0"); + frmvBy.getContentPane().setBackground(UIManager.getColor("Button.background")); + frmvBy.setTitle("ESSA自动化测试工具v1.0.1"); + frmvBy.setIconImage(Toolkit.getDefaultToolkit().getImage(SwingMain.class.getResource("/swing/icon.png"))); + frmvBy.getContentPane().setEnabled(false); + frmvBy.setResizable(false); + frmvBy.setBackground(UIManager.getColor("Button.background")); + frmvBy.setForeground(Color.LIGHT_GRAY); + frmvBy.setBounds(650, 350, 526, 467); + frmvBy.setSize(686, 405); + frmvBy.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frmvBy.getContentPane().setLayout(null); + + //日志 + JScrollPane jsp; + ja = new JTextArea(); + jsp = new JScrollPane(ja); + jsp.setBounds(22, 186, 631, 134); + frmvBy.getContentPane().add(jsp); + + ja.setEditable(false); + ja.setWrapStyleWord(true); + ja.setLineWrap(true); + ja.setFont(new Font("微软雅黑", Font.PLAIN, 13)); + ja.append(getCurrentTime() + "默认选择场景:新增原厂商品\r\n"); + + //操作环境选择 + JLabel label = new JLabel("操作环境:"); + label.setBounds(24, 53, 78, 15); + label.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + frmvBy.getContentPane().add(label); + + //加入到购物车场景 + final JPanel ToCart = new JPanel(); + ToCart.setBounds(231, 42, 230, 128); + ToCart.setVisible(false); + frmvBy.getContentPane().add(ToCart); + ToCart.setLayout(null); + + //可视化操作选项 + JLabel label_1 = new JLabel("可视化操作:"); + label_1.setBounds(10, 119, 88, 15); + label_1.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + frmvBy.getContentPane().add(label_1); + + //可视化 + JRadioButton view = new JRadioButton("是"); + view.setBounds(103, 115, 42, 23); + view.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + view.setSelected(true); + frmvBy.getContentPane().add(view); + + //无头浏览器 + JRadioButton notView = new JRadioButton("否"); + notView.setBounds(160, 115, 44, 23); + notView.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + notView.setEnabled(false); + frmvBy.getContentPane().add(notView); + + ButtonGroup group = new ButtonGroup(); + group.add(view); + group.add(notView); + + //po询价场景 + final JPanel POInquiry = new JPanel(); + POInquiry.setBounds(231, 42, 234, 134); + frmvBy.getContentPane().add(POInquiry); + POInquiry.setVisible(false); + POInquiry.setLayout(null); + + // po单号字段 + JLabel POnum = new JLabel("PO单号:"); + POnum.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + POnum.setBounds(25, 5, 68, 25); + POInquiry.add(POnum); + + // po单号文本值 + po = new JTextField(); + po.setBounds(90, 6, 110, 25); + POInquiry.add(po); + po.setColumns(10); + + //必填文本 + JLabel lblNewLabel = new JLabel("*必填"); + lblNewLabel.setFont(new Font("微软雅黑", Font.PLAIN, 12)); + lblNewLabel.setForeground(Color.RED); + lblNewLabel.setBounds(200, 10, 44, 15); + POInquiry.add(lblNewLabel); + + //右侧流程介绍文本 + final JLabel process = new JLabel(); + process.setBounds(474, 25, 179, 170); + process.setForeground(Color.GRAY); + process.setFont(new Font("微软雅黑", Font.PLAIN, 12)); + process.setText( + "新增原厂商品场景流程:
1.商品建档
2.更新商品图片
3.审核商品
4.检查商品库,验证是否新增成功
PS:以上均由账号(linxun)操作

"); + frmvBy.getContentPane().add(process); + + //操作场景 + JLabel label_2 = new JLabel("操作场景:"); + label_2.setBounds(24, 87, 78, 15); + label_2.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + frmvBy.getContentPane().add(label_2); + + //新增原厂商品场景 + final JPanel addOriginal = new JPanel(); + addOriginal.setBounds(231, 37, 234, 134); + addOriginal.setVisible(true); + frmvBy.getContentPane().add(addOriginal); + addOriginal.setLayout(null); + + //场景选择,插入对应的值,并打印在日志上 + final JComboBox selectSystem = new JComboBox(); + selectSystem.setBounds(102, 51, 114, 20); + selectSystem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if ("SIT".equals((String) selectSystem.getSelectedItem())) { + Model.setEnv("SIT"); + ja.append(getCurrentTime() + "已选择环境:SIT\r\n"); + } else if ("DIT".equals((String) selectSystem.getSelectedItem())) { + Model.setEnv("DIT"); + ja.append(getCurrentTime() + "已选择环境:DIT\r\n"); + } else if ("HOTFIX".equals((String) selectSystem.getSelectedItem())) { + Model.setEnv("HOTFIX"); + ja.append(getCurrentTime() + "已选择环境:HOTFIX\r\n"); + } else if ("UAT".equals((String) selectSystem.getSelectedItem())) { + Model.setEnv("UAT"); + ja.append(getCurrentTime() + "已选择环境:UAT\r\n"); + } + } + }); + selectSystem.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + selectSystem.addItem("SIT"); + selectSystem.addItem("HOTFIX"); + selectSystem.addItem("UAT"); + selectSystem.addItem("DIT"); + frmvBy.getContentPane().add(selectSystem); + + //添加市场商品 + final JPanel addMarket = new JPanel(); + addMarket.setBounds(0, 67, 230, 46); + addOriginal.add(addMarket); + addMarket.setVisible(false); + addMarket.setLayout(null); + + //采购商注册 + final JPanel register = new JPanel(); + register.setBounds(231, 42, 224, 134); + frmvBy.getContentPane().add(register); + + //浏览器选择 + final JComboBox browser = new JComboBox(); + browser.setEnabled(false); + browser.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + browser.setBounds(102, 147, 114, 20); + browser.setModel(new DefaultComboBoxModel(new String[] { "Chrome", "Firefox", "IE" })); + frmvBy.getContentPane().add(browser); + + //场景选择,根据随选场景做对应的交互 + final JComboBox selectScene = new JComboBox(); + selectScene.setBounds(102, 85, 114, 20); + selectScene.setForeground(Color.BLACK); + selectScene.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + selectScene.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + //此处为默认将所有的场景视图先隐藏,后续根据所选场景显示对应的视图 + addOriginal.setVisible(false); + addMarket.setVisible(false); + ToCart.setVisible(false); + POInquiry.setVisible(false); + register.setVisible(false); + if ("新增原厂商品".equals((String) selectScene.getSelectedItem())) { + process.setText( + "新增原厂商品场景流程:
1.商品建档
2.更新商品图片
3.审核商品
4.检查商品库,验证是否新增成功
PS:以上均由账号(linxun)操作

"); + addOriginal.setVisible(true); + ja.append(getCurrentTime() + "已选择场景:新增原厂商品\r\n"); + } else if ("新增市场商品".equals((String) selectScene.getSelectedItem())) { + process.setText("新增市场商品场景流程:
" + "1.指定采购商编号(默认:RUS00833)
" + + "2.使用账号(maomeixiang)对指定采购商进行市场商品建档并选择审核人为\"邢昌勇\"
" + + "3.使用账号(xingchangyong)对市场商品审核
"); + addOriginal.setVisible(true); + addMarket.setVisible(true); + ja.append(getCurrentTime() + "已选择场景:新增市场商品\r\n"); + } else if ("发布团购".equals((String) selectScene.getSelectedItem())) { + ja.append(getCurrentTime() + "已选择场景:发布团购,运行过程中将会打开关闭浏览器2次!\r\n"); + process.setText( + "发布团购场景流程:
1.先执行新增原厂商品流程,生成一个原厂SKU
2.使用账号(linrong)为新增的SKU分配类目经理
3.团购设置中添加该SKU,并发布团购,验证团购发布结果"); + addOriginal.setVisible(true); + } else if ("采购商注册".equals((String) selectScene.getSelectedItem())) { + register.setVisible(true); + ja.append(getCurrentTime() + "已选择场景:采购商注册,运行过程中将会打开关闭浏览器2次!\r\n"); + process.setText( + "采购商注册流程:
1.使用账号(admin)在bpms后台生成一个邀请码
2.采购商平台填写注册信息,并填入上一步生成的邀请码
PS:新账号密码默认为:essa123


"); + } else if ("添加SKU至购物车".equals((String) selectScene.getSelectedItem())) { + ToCart.setVisible(true); + ja.append(getCurrentTime() + "已选择场景:添加SKU至购物车\r\n"); + process.setText( + "添加SKU至购物车流程:
1.Buyer平台根据填入的采购
商信息进行登录操作
2.若未填写商品编号,将从数
据库随机查出一个符合要求的
sku添加至购物车


"); + } else if ("成品询价".equals((String) selectScene.getSelectedItem())) { + ToCart.setVisible(true); + ja.append(getCurrentTime() + "已选择场景:成品询价,将重启浏览器多次\r\n"); + process.setText( + "成品询价流程:
1.Buyer平台根据填入的采购
商信息加入sku,若未填写sku
编号,将随机从数据库获取符
合要求的sku
2.bpms后台登录账号(chenhong)对该sku进行成
品询价审核
"); + } else if ("生成PO".equals((String) selectScene.getSelectedItem())) { + ToCart.setVisible(true); + ja.append(getCurrentTime() + "已选择场景:生成PO,将重启浏览器多次\r\n"); + process.setText( + "生成PO流程:
1.采购商平台加入商品至购物车
2.bpms后台登录账号(chenhong)对该sku进行成品询价审核
3.再次登录采购商平台,进行拼柜、设置唛头、贴纸和提交PO操作"); + } else if ("PO询价".equals((String) selectScene.getSelectedItem())) { + POInquiry.setVisible(true); + ja.append(getCurrentTime() + "已选择场景:PO询价\r\n"); + process.setText("PO询价使用介绍:
1.填入需要询价的PO单号
2.工具将对该PO单号循环进行询价,直到所有商品均询价完成
3.如果运行过程中出现询价异常等弹框,手工关闭弹窗后脚本仍会继续执行之后的操作"); + } + } + }); + selectScene.setModel( + new DefaultComboBoxModel(new String[] { "新增原厂商品", "新增市场商品", "发布团购", "采购商注册", "成品询价", "生成PO", "PO询价" })); + frmvBy.getContentPane().add(selectScene); + + JLabel label_3 = new JLabel("供应商名称:"); + label_3.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + label_3.setBounds(9, 15, 91, 15); + addOriginal.add(label_3); + + //供应商名称 + supplierName = new JTextField(); + supplierName.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + supplierName.setForeground(Color.BLACK); + supplierName.setBounds(92, 10, 114, 25); + addOriginal.add(supplierName); + supplierName.setText(supplier); + supplierName.setColumns(10); + + //选择图片 + JButton button = new JButton("选择图片"); + button.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + button.setBounds(91, 44, 91, 23); + addOriginal.add(button); + + JLabel lblSku = new JLabel("商品图片:"); + lblSku.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + lblSku.setBounds(22, 48, 70, 15); + addOriginal.add(lblSku); + + final JLabel label_7 = new JLabel("*必填"); + label_7.setFont(new Font("微软雅黑", Font.PLAIN, 12)); + label_7.setBounds(192, 48, 42, 15); + addOriginal.add(label_7); + label_7.setForeground(Color.RED); + + //图片地址 + final JLabel picPath = new JLabel(""); + picPath.setVisible(false); + addOriginal.add(picPath); + + JLabel label_5 = new JLabel("采购商编号:"); + label_5.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + label_5.setBounds(8, 15, 86, 15); + addMarket.add(label_5); + + //采购商编号 + buyerNo2 = new JTextField(); + buyerNo2.setBounds(93, 11, 114, 25); + addMarket.add(buyerNo2); + buyerNo2.setFont(new Font("宋体", Font.PLAIN, 14)); + buyerNo2.setText(buyerNo); + buyerNo2.setColumns(10); + + //选择图片按钮 + button.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JFileChooser jf = new JFileChooser(); + jf.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + jf.showDialog(new JLabel(), "选择图片"); + File file = jf.getSelectedFile(); + String s = null; + try { + s = file.getAbsolutePath(); + } catch (NullPointerException exception) { + } + if (s == "" || s == null) { + ja.append(getCurrentTime() + "您未选择图片,请选择图片\r\n"); + } else { + ja.append(getCurrentTime() + "选择的图片为:" + s + "\r\n"); + picPath.setText(s); + label_7.setText("已选"); + } + } + }); + + JLabel label_4 = new JLabel("浏览器:"); + label_4.setBounds(38, 149, 62, 15); + label_4.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + frmvBy.getContentPane().add(label_4); + + //开始按钮 + JButton btnNewButton = new JButton("开 始"); + btnNewButton.setBounds(551, 325, 101, 35); + frmvBy.getContentPane().add(btnNewButton); + btnNewButton.setFont(new Font("微软雅黑", Font.PLAIN, 17)); + + JLabel lblEssav = new JLabel("ESSA自动化测试工具 V1.0.1"); + lblEssav.setBounds(225, 10, 228, 29); + lblEssav.setFont(new Font("微软雅黑", Font.BOLD, 16)); + frmvBy.getContentPane().add(lblEssav); + + JLabel lblwindowsjdkbug = new JLabel( + "提示:1.建议使用版本号为68.0的Chrome浏览器
         2.由于部分操作会用到鼠标事件,若运行时手动切换界面可能会导致运行出错"); + lblwindowsjdkbug.setFont(new Font("微软雅黑", Font.PLAIN, 12)); + lblwindowsjdkbug.setBounds(25, 323, 456, 40); + frmvBy.getContentPane().add(lblwindowsjdkbug); + + JLabel Account = new JLabel("采购商账号:"); + Account.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + Account.setBounds(9, 10, 88, 15); + ToCart.add(Account); + + JLabel Password = new JLabel("密码:"); + Password.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + Password.setBounds(50, 41, 65, 15); + ToCart.add(Password); + + JLabel No = new JLabel("商品编号:"); + No.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + No.setBounds(22, 100, 88, 15); + ToCart.add(No); + + account = new JTextField(); + account.setText(buyerAccount); + account.setFont(new Font("微软雅黑", Font.PLAIN, 12)); + account.setBounds(92, 4, 130, 25); + ToCart.add(account); + account.setColumns(10); + + password = new JTextField(); + password.setText("essa123"); + password.setToolTipText(""); + password.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + password.setBounds(92, 37, 130, 25); + ToCart.add(password); + password.setColumns(10); + + //sku编号 + SkuNo = new JTextArea(); + SkuNo.setText("选填,勿填活动商品"); + SkuNo.setForeground(Color.LIGHT_GRAY); + SkuNo.setFont(new Font("微软雅黑", Font.PLAIN, 12)); + SkuNo.setLineWrap(true); + SkuNo.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (SkuNo.getText().equals("选填,勿填活动商品") || SkuNo.getText().equals("选填,勿填非活动商品") ) { + SkuNo.setForeground(Color.black); + SkuNo.setText(""); + } + } + }); + SkuNo.setBounds(92, 100, 130, 25); + SkuNo.setBorder(new LineBorder(new Color(127,157,185), 1, false)); + ToCart.add(SkuNo); + SkuNo.setColumns(10); + + //商品类型 + JLabel kind = new JLabel("商品类型:"); + kind.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + kind.setBounds(22, 75, 70, 15); + ToCart.add(kind); + + //非活动商品 + JRadioButton notActivity = new JRadioButton("非活动"); + notActivity.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + Model.setIsactivity(0); + SkuNo.setText("选填,勿填活动商品"); + } + }); + notActivity.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + notActivity.setBounds(92, 71, 70, 23); + ToCart.add(notActivity); + + //活动商品 + JRadioButton isActivity = new JRadioButton("活动"); + isActivity.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Model.setIsactivity(1); + SkuNo.setText("选填,勿填非活动商品"); + } + }); + isActivity.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + isActivity.setBounds(165, 71, 64, 23); + ToCart.add(isActivity); + + //活动和非活动单选 + ButtonGroup group1 = new ButtonGroup(); + group1.add(notActivity); + group1.add(isActivity); + notActivity.setSelected(true); + + JLabel RegisterAccount = new JLabel("采购商邮箱:"); + register.add(RegisterAccount); + RegisterAccount.setFont(new Font("微软雅黑", Font.PLAIN, 14)); + + registerAccount = new JTextField(); + registerAccount.setForeground(Color.LIGHT_GRAY); + registerAccount.setText("若不填写将自动生成"); + registerAccount.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (registerAccount.getText().equals("若不填写将自动生成")) { + registerAccount.setForeground(Color.black); + registerAccount.setText(""); + } + } + }); + register.add(registerAccount); + registerAccount.setFont(new Font("微软雅黑", Font.PLAIN, 13)); + registerAccount.setColumns(10); + + btnNewButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + SwingWorker worker = new SwingWorker() {// 加入线程 + + @Override + protected Void doInBackground() throws Exception { + String Environment = (String) selectSystem.getSelectedItem(); + String Scene = (String) selectScene.getSelectedItem(); + String Browser = (String) browser.getSelectedItem(); + //记录用户输入的数据,下次读取 + setData("supplier", supplierName.getText()); + setData("buyerNo", buyerNo2.getText()); + setData("buyerAccount", account.getText()); + ja.append(getCurrentTime() + "程序正在启动中……切勿双击【开始】\r\n"); + BrowserEngine.setInit(Environment, Browser); + TestNG testNG = new TestNG(); + List suites = new ArrayList(); + if (Scene == "新增原厂商品") { + AddOriginalGoodsPage.setSupplierName(supplierName.getText()); + UpdatePicPage.setPicPath(picPath.getText()); + suites.add(".\\resources\\suites\\addOriginalGoods.xml");// 图形界面 + } else if (Scene == "新增市场商品") { + Model.setBuyerNo(buyerNo2.getText()); + Model.setPicPath(picPath.getText()); + Model.setSupplierName(supplierName.getText()); + suites.add(".\\resources\\suites\\addMarketGoods.xml");// 图形界面 + } else if (Scene == "发布团购") { + AddOriginalGoodsPage.setSupplierName(supplierName.getText()); + UpdatePicPage.setPicPath(picPath.getText()); + suites.add(".\\resources\\suites\\publishGroupPurchase.xml");// 图形界面 + } else if (Scene == "采购商注册") { + if (!(registerAccount.getText().equals("") + || registerAccount.getText().equals("若不填写将自动生成"))) { + Model.setEmail(registerAccount.getText()); + } + suites.add(".\\resources\\suites\\buyerRegister.xml");// 图形界面 + } else if (Scene == "添加SKU至购物车") {// 暂时舍弃 + Model.setBuyerAccount(account.getText()); + Model.setBuyerPassword(password.getText()); + Model.setSkuNo(SkuNo.getText()); + suites.add(".\\resources\\suites\\addSkuToCart.xml"); + } else if (Scene == "成品询价") { + Model.setBuyerAccount(account.getText()); + Model.setBuyerPassword(password.getText()); + Model.setSkuNo(SkuNo.getText()); + if (Model.getIsactivity() == 1) { + suites.add(".\\resources\\suites\\activityInquiry.xml"); + }else { + suites.add(".\\resources\\suites\\productInquiry.xml"); + } + } else if (Scene == "生成PO") { + Model.setBuyerAccount(account.getText()); + Model.setBuyerPassword(password.getText()); + Model.setSkuNo(SkuNo.getText()); + if (Model.getIsactivity() == 1) { + suites.add(".\\resources\\suites\\activitySendPO.xml"); + }else { + suites.add(".\\resources\\suites\\sendPO.xml"); + } + } else if (Scene == "PO询价") { + Model.setPoNum(po.getText()); + suites.add(".\\resources\\suites\\POInquiry.xml"); + } + testNG.setTestSuites(suites); + testNG.run(); + ja.append(getCurrentTime() + "=======" + Scene + "场景,执行完毕!=======\r\n"); + if (Scene == "新增原厂商品" || Scene == "新增市场商品" || Scene == "发布团购") { + no = Model.getSkuNo(); + if (no != null) { + ja.append(getCurrentTime() + "SKU商品编号:" + no + "\r\n"); + } else { + ja.append(getCurrentTime() + + "程序执行失败了!\r\n你可查看目录中test-output/index.html的测试报告,或者查看Log中的执行日志检查原因\r\n"); + } + } else if (Scene == "采购商注册") { + String code = Model.getInvateCode(); + String email = Model.getEmail(); + if (code != null && email != null) { + ja.append(getCurrentTime() + "生成的邀请码:" + Model.getInvateCode() + "\r\n"); + ja.append(getCurrentTime() + "新采购商邮箱:" + Model.getEmail() + "\r\n"); + } else { + ja.append(getCurrentTime() + + "程序执行失败了!\r\n你可以分析目录中test-output/index.html的测试报告,或者查看目录中Log文件夹生成的执行日志\r\n"); + } + } else if (Scene == "添加SKU至购物车") { + ja.append(getCurrentTime() + "所选采购商账号:" + Model.getBuyerAccount() + "\r\n"); + ja.append(getCurrentTime() + "添加的SKU编号为:" + Model.getSkuNo() + "\r\n"); + } else if (Scene == "成品询价") { + ja.append(getCurrentTime() + "采购商账号:" + Model.getBuyerAccount() + "\r\n"); + ja.append(getCurrentTime() + "SKU编号:" + Model.getSkuNo() + "\r\n"); + } else if (Scene == "生成PO") { + ja.append(getCurrentTime() + "采购商账号:" + Model.getBuyerAccount() + "\r\n"); + ja.append(getCurrentTime() + "PO单号:" + Model.getPoNum() + "\r\n"); + } + return null; + } + }; + worker.execute(); + + } + }); + + } +} diff --git a/src/main/java/swing/icon.png b/src/main/java/swing/icon.png new file mode 100644 index 0000000..475b23e Binary files /dev/null and b/src/main/java/swing/icon.png differ diff --git a/src/main/resources/chromedriver.exe b/src/main/resources/chromedriver.exe new file mode 100644 index 0000000..370e9eb Binary files /dev/null and b/src/main/resources/chromedriver.exe differ diff --git a/src/main/resources/config.properties b/src/main/resources/config.properties new file mode 100644 index 0000000..414e8d8 --- /dev/null +++ b/src/main/resources/config.properties @@ -0,0 +1,16 @@ +#browserName=FireFox +#browserName=IE +browserName=Chrome + +SIT=http://bpms.sit.gz.essa +BSIT=http://en.portalsit.cn + +HOTFIX=http://bpms.hotfix.gz.essa +BHOTFIX=http://en.portalhotfix.cn + +UAT=http://bpms.spstoys.com:7291 +BUAT=http://en.spstoys.com:889 + +DIT=http://bpms.dit.gz.essa +BDIT=http://en.portaldit.cn + diff --git a/src/main/resources/data.xml b/src/main/resources/data.xml new file mode 100644 index 0000000..4b8e61c --- /dev/null +++ b/src/main/resources/data.xml @@ -0,0 +1,9 @@ + + + + + meng18@essa.cn + 物料分析 + COK09161 + + diff --git a/src/main/resources/suites/POInquiry.xml b/src/main/resources/suites/POInquiry.xml new file mode 100644 index 0000000..5cf6942 --- /dev/null +++ b/src/main/resources/suites/POInquiry.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/suites/activityInquiry.xml b/src/main/resources/suites/activityInquiry.xml new file mode 100644 index 0000000..f3f1858 --- /dev/null +++ b/src/main/resources/suites/activityInquiry.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/suites/activitySendPO.xml b/src/main/resources/suites/activitySendPO.xml new file mode 100644 index 0000000..52cb8a0 --- /dev/null +++ b/src/main/resources/suites/activitySendPO.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/suites/addMarketGoods.xml b/src/main/resources/suites/addMarketGoods.xml new file mode 100644 index 0000000..666d27b --- /dev/null +++ b/src/main/resources/suites/addMarketGoods.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/main/resources/suites/addOriginalGoods.xml b/src/main/resources/suites/addOriginalGoods.xml new file mode 100644 index 0000000..41025ca --- /dev/null +++ b/src/main/resources/suites/addOriginalGoods.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/suites/addSkuToCart.xml b/src/main/resources/suites/addSkuToCart.xml new file mode 100644 index 0000000..8273552 --- /dev/null +++ b/src/main/resources/suites/addSkuToCart.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/main/resources/suites/buyerRegister.xml b/src/main/resources/suites/buyerRegister.xml new file mode 100644 index 0000000..4b0bcb7 --- /dev/null +++ b/src/main/resources/suites/buyerRegister.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/suites/productInquiry.xml b/src/main/resources/suites/productInquiry.xml new file mode 100644 index 0000000..b253775 --- /dev/null +++ b/src/main/resources/suites/productInquiry.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/suites/publishGroupPurchase.xml b/src/main/resources/suites/publishGroupPurchase.xml new file mode 100644 index 0000000..49e9eb5 --- /dev/null +++ b/src/main/resources/suites/publishGroupPurchase.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/suites/sendPO.xml b/src/main/resources/suites/sendPO.xml new file mode 100644 index 0000000..e5f17ee --- /dev/null +++ b/src/main/resources/suites/sendPO.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/suites/sendPO2.xml b/src/main/resources/suites/sendPO2.xml new file mode 100644 index 0000000..aa551c5 --- /dev/null +++ b/src/main/resources/suites/sendPO2.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + -- libgit2 0.21.2