首页 > 技术文章 > selenium + Java UI自动化,常用定位方式总结分析

mixiu26 2019-08-01 23:04 原文

1.diver.findElement(By.cssSelector("i.map-item...")).click();
2.多层定位: diver.findElement(By.cssSelector(i.map-item...)).findElement(By.cssSelector(div.dialog-p));
3. 获取元素对象对元素进行操作: WebElement ele = diver.findElement(By.cssSelector(i.map-item...)).findElement(By.cssSelector(div.dialog-p));

4.div["属性值"] ----- >> driver.findElement(By.cssSelector("div[class=\"s-weather-wrapper\"]")) ---- >> 属性完整copy

5.页面图层绘图操作:
WebElement cvs = driver.findElement(By.tagName("xxxx"))
//获取鼠标操作对象:
Actions actions = new Actions(driver);
//移动元素:
Thread.sleep(1000);
//生效鼠标操作
actions.moveToElement(cvs,xx,xx).click().perform();
//双击操作图层 ----- >> 为什么选择双击鼠标,
// 因为有些图层在这里单次击不生效,笔者之前为这个问题困扰了很长时间,目前发现这个方法百试百灵,
actions.clickAndHold((cvs,xx, xx)).perform();

actions.moveToElement(cvs,xx+20,xx+20).click().perform();

actions.clickAndHold().perform();
//释放鼠标:
actions.release().perform();

//文本框发送内容定位方法:
WebElement element = driver.findElement(By.cssSelector("div.s-weather-wrapper"));
((JavascriptExecutor) driver).executeScript("arguments[0].value=\'abcdefg\'", element);

//定位单个元素后在定义下层目录:
WebElement ele = driver.findElement(By.cssSelector("div.recs_wrapp_Inp... > i "));
ele.findElement(By.cssSelector("div:nth-child(1)>ul>li:nth-child(5)")).click();
//表示第二个tr下面的第二个td下面的div--- >>这种用伪类元素定位是最为方便
driver.findElement(By.cssSelector("tr:nth-child(2)>td:nth-child(2)>div")).click();
//表示第二个div下面的第二个div子元素
driver.findElement(By.cssSelector("div>div>div:nth-child(2)")).click();
//copy整个属性值:
driver.findElement(By.cssSelector("div[class=\"s-weather- wrapper\"]")).click();
//定位部分标志元素:
driver.findElement(By.cssSelector("input[title=\"清空\"]"))
//任意的属性值都可以定义:
driver.findElement(By.cssSelector("ul[class=\"s-weather- wrapper\"]")).findElement(By.tagName("li"));
//xpath
List<WebElement> ls = driver.findElements(By.xpath("//div[@class='s-weather- wrapper']"));
ls.get(0).findElement(By.cssSelector("span.ant-box")).click();
driver.findElement(By.xpath("//li3/span(2)")).click();

在UI测试的过程中,我们经常会遇到对下拉框的处理, 笔者在日常的维护中, 对下拉框的处理的太多, 各种好定位的不好定位的, 这里可以分享两种定位方法:
1.日常定位的方法每个select下拉框都是一个list,在取值时,取到对应list[x][y] ---- >>找到对应要选取得的值;
driver.findElement(By.cssSelector("div.address-selects>div>")).click();
List<WebElement> vans = driver.findElements(By.cssSelector("select.needsclick.field-transformed"));
List<WebElement> wans = vans.get(0).findElements(By.tagName("option"));
wans.get(11).click();
driver.findElement(By.cssSelector("div.address-selects>div")).click();
List<WebElement> ses = vans.get(1).findElements(By.tagName("option"));
ses.get(1).click();
driver.findElement(By.cssSelector("div.address-selects>div>")).click();
List<WebElement> thid = vans.get(2).findElements(By.tagName("option"));
thid.get(8).click();

2.通过封装后的select类,可以直接快速定位,不过此种方式存在一定的局限性, 定位的元素必须是可读固定,如果一个元素的属性是auto,或者不可读,就不能再根据某个固有属性来定位了, 不过这种方式也可以满足我们日常80%的需求了。对select类的处理方式是笔者最近刚刚学来的, 笔者个人是比较倾向于第一种定位方式, 至少在知道select类之前, 笔者一直都是用传统的方式处理下拉框,已经666了,哈哈哈, 不过萝卜白菜各有所爱, 能定位到元素就可以了, 没必要一定要用那种方式了。关键时候还是灵活变通啊,这里分享两种定位方式,希望能帮到大家

Select Provience = new Select(driver.findElement(By.name("entry[field_6][province]")));
Provience.selectByValue("浙江省");
Select City = new Select(driver.findElement(By.name("entry[field_6][city]")));
City.selectByValue("杭州市");
Select area = new Select(driver.findElement(By.name("entry[field_6][district]")));
area.selectByValue("西湖区");

3.另外在附送一个对页面隐藏元素的处理方式: 滚动到指定位置
WebElement eles = driver.findElement(By.cssSelector("div.field.field-address-field.col-sm-12"));
JavascriptExecutor js1 = (JavascriptExecutor) driver;
js1.executeScript("arguments[0].scrollIntoView(true);",eles);
Thread.sleep(1000);

4.富文本框发送内容: js --- 方式
public void seContent(String content) {
String js = String.format("document.getElementById('content_ifr').contentWindow.document.body.innerHTML = '%s'",
content);
((JavascriptExecutor)driver).executeScript(js);
}



推荐阅读