JavaScript&DOM

脚本使用

<head></head>

<script></script>

<body></body>

HTML DOM

可以让javascript了解到html的所有文档的元素

获取元素

使用 document.getElementById() 获取特定 ID 的元素。
使用 document.querySelector() 和 document.querySelectorAll() 通过 CSS 选择器获取单个或多个元素。
使用 document.getElementsByClassName() 和 document.getElementsByTagName() 获取类名或标签名匹配的元素集合。

修改元素内容

通过 innerHTML 属性修改元素的 HTML 内容。
通过 textContent 或 innerText 修改元素的纯文本内容。

修改元素属性

使用 setAttribute() 和 getAttribute() 设置或获取元素的属性值。
直接通过属性名修改,如 element.src = "new-image.jpg"

修改样式

通过 style 属性直接修改内联样式,如 element.style.color = "red"
使用 classList 操作类名,如 classList.add()classList.remove() 和 classList.toggle()

创建和添加元素

使用 document.createElement() 创建新元素。
通过 appendChild() 或 insertBefore() 将元素添加到 DOM 中。
使用 parentElement.removeChild() 移除子元素。

事件处理

使用 addEventListener() 为元素绑定事件监听器。
通过 removeEventListener() 移除事件监听器。
常见事件包括 clickmouseoverkeydown 等。

遍历 DOM

使用 parentNodechildNodesfirstChild 和 lastChild 遍历节点。
通过 nextSibling 和 previousSibling 访问兄弟节点。

表单操作

通过 value 属性获取或设置表单元素的值。
使用 submit() 方法提交表单。
监听 submit 事件以处理表单提交行为。

动态加载内容

使用 fetch() 或 XMLHttpRequest 动态加载数据并更新 DOM。
通过 createElement 和 appendChild 动态生成内容。

性能优化

避免频繁操作 DOM,使用文档片段 DocumentFragment 批量操作。
使用事件委托减少事件监听器的数量。
对大量数据使用虚拟滚动或分页加载。

Selenium

Selenium IDE

Selenium WebDriver

基本元素定位:

id:唯一

        EdgeDriver driver =new EdgeDriver();
		//打开百度页面
		driver.get("https://www.baidu.com");
		//定位百度搜索框---id
		driver.findElement(By.id("chat-textarea")).sendKeys("腾讯课堂");

注意点:自动提交情况的原因

1.百度搜索框的自动提交机制

百度搜索框有监听键盘事件,当你在输入框中输入内容后,有时会触发自动搜索

特别是在自动化测试环境中,Selenium的sendKeys()方法可能会触发某些事件

2.Selenium的sendKeys行为

sendKeys()方法在输入完成后,有时会模拟键盘事件

可能意外触发了回车键或表单提交

name:存在重复

tagname

classname

linktext:超链接的完整文本---精确匹配容易找不到,存在空格等匹配问题

        EdgeDriver driver =new EdgeDriver();
		//打开百度页面
		driver.get("https://www.baidu.com");
		//定位百度搜索框---id
		//driver.findElement(By.id("chat-textarea")).sendKeys("腾讯课堂");
		//打开超链接
		driver.findElement(By.linkText("新闻")).click();

partialLinktext:超链接的部分/完整文本

		EdgeDriver driver =new EdgeDriver();
		//打开百度页面
		driver.get("https://www.baidu.com");
		//定位百度搜索框---id
		//driver.findElement(By.id("chat-textarea")).sendKeys("腾讯课堂");
		//打开超链接
		driver.findElement(By.partialLinkText("新闻")).click();

css selector

·tagname

·id(#id)

package com.test;

import java.time.Duration;

import org.openqa.selenium.By;
import org.openqa.selenium.By.ById;
import org.openqa.selenium.edge.EdgeDriver;

public class ElementLocate {
	public static void main(String[] args) {
		EdgeDriver driver =new EdgeDriver();
        // 最大化窗口
        driver.manage().window().maximize();
        
        // 设置隐式等待
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        
		//打开百度页面
		driver.get("https://www.baidu.com");
		//定位百度搜索框---id
		//driver.findElement(By.id("kw")).sendKeys("腾讯课堂");
		//打开超链接
		//driver.findElement(By.partialLinkText("新闻")).click();
		//css selector选择器定位
		driver.findElement(By.cssSelector("#chat-textarea")).sendKeys("疯狂动物城");
		driver.findElement(By.cssSelector("#chat-submit-button")).click();
	}
}

·classname(.classname)

·精确定位:标签名[属性1='属性值'][属性2='属性值']

xpath

相对路径:

//:匹配指定节点

*通配符

@选取属性

[]属性判断条件表达式:

·通过属性查找

·通过函数text()/contains()查找

元素操作API

click()

clear()

sendKey()

getTagName():获取元素的标签名

getAtrribute(属性名):根据属性名获取元素的属性值

getText():获取当前元素的文本值

isDisplayed():查看元素是否显示

		EdgeDriver driver =new EdgeDriver();
		//打开百度页面
		driver.get("https://www.baidu.com");
		WebElement element1 =driver.findElement(By.id("chat-textarea"));
		System.out.println("搜索框的标签名为"+element1.getTagName());
		System.out.println("搜索框的classname属性为"+element1.getAttribute("classname"));
		WebElement element2=driver.findElement(By.xpath("//a[contains(text(),'新闻')]"));
		System.out.println("新闻的文本为:"+element2.getText());
		System.out.println("元素是否显示"+element2.isDisplayed());

WebDriver相关API

get(url)

getCurrentUrl():获得当前的路径

getTitle():获取标题

getPageSource()::获取页面源代码

quit():关闭页面

package com.test;

import org.openqa.selenium.edge.EdgeDriver;

public class WebDriveroperate {
	public static void main(String[] args) throws InterruptedException {
		EdgeDriver driver =new EdgeDriver();
		//打开百度页面
		driver.get("https://www.baidu.com");
		System.out.println(driver.getCurrentUrl());
		System.out.println(driver.getTitle());
		System.out.println(driver.getPageSource());
		driver.quit();
	}
}

close():关闭当前窗口(百度-》新闻,关闭百度窗口)

getWindowHandle():返回页面句柄(页面标志)

getWindowHandles():返回所有由驱动对象打开页面的所有句柄,页面不同,句柄不同

EdgeDriver driver =new EdgeDriver();
		//打开百度页面
		driver.get("https://www.baidu.com");
		System.out.println("新窗口打开前的句柄:"+driver.getWindowHandle());
//		System.out.println(driver.getCurrentUrl());
//		System.out.println(driver.getTitle());
//		System.out.println(driver.getPageSource());
//		driver.quit();
		driver.findElement(By.partialLinkText("新闻")).click();
		Thread.sleep(3000);
		System.out.println("新窗口打开后的句柄:"+driver.getWindowHandle());
		System.out.println("新窗口打开后的所有句柄:"+driver.getWindowHandles());

注意点:当打开新的窗口默认在旧的句柄

manage():此方法可以获取Options--浏览器菜单操作对象

        Options option=driver.manage();
		option.window().fullscreen();//最大化窗口
		Dimension dimension=option.window().getSize();
		System.out.println("当前窗口的高度"+dimension.getHeight());
		System.out.println("当前窗口的宽度"+dimension.getWidth());
		System.out.println("当前窗口的位置X坐标"+option.window().getPosition().getX()+",当前窗口的位置Y坐标"+option.window().getPosition().getY());
		

navigate对象--导航对象

		Navigation nav=driver.navigate();
		//访问京东
		nav.to("https://www.jd.com");
		//刷新
		nav.refresh();
		//回退
		nav.back();
		//前进
		nav.forward();

三大等待---重点!!!!!!

代码执行速度太快,UI元素没有立马显示出来导致两者不同步从而元素找不到

强制等待:Thread.sleep();---用户自己定义

显示等待:用来等待某个条件发生之后在继续执行后续代码(如找到元素、元素可点击、、元素以已显示)

package com.test;

import java.time.Duration;

import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver.Navigation;
import org.openqa.selenium.WebDriver.Options;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class WebDriveroperate {
	public static void main(String[] args) throws InterruptedException {
		EdgeDriver driver =new EdgeDriver();
		//打开百度页面
		driver.get("https://www.baidu.com");
		Navigation nav=driver.navigate();
//		//访问京东
		nav.to("https://www.jd.com");
//		//回退
		nav.back();
        //设置显示等待。15s
		WebDriverWait wait=new WebDriverWait(driver, Duration.ofSeconds(15));
		//等到新闻元素可见就点击
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"s-top-left\"]/a[1]")));
		driver.findElement(By.xpath("//*[@id=\"s-top-left\"]/a[1]")).click();
	}
}

隐式等待:在设置的超时时间范围范围内不断查找元素知道找到元素或者超时

driver.manage.timeouts,implicitlyWait(lng time,TimeUnit unit);

优点:相对灵活

缺点:设置是针对全局的,在WebDriver实例整个生命周期有效啊,但并不是所有元素都需要等待

注意点:在实例化完成之后就设置隐式等待

特殊元素定位与操作

模态框---alert

Alert alert =driver.switchTo().alert();

alert.accept();

alert.dismiss();

alert.getText();

模态框---confirm(有确定和取消)

Alert alert =driver.switchTo().alert();

alert.accept();

alert.dismiss();

alert.getText();

iframe切换--内嵌网页切换

四种切换:

driver.switchTo().frame(index);

driver.switchTo().frame(id);

driver.switchTo().frame(name);

driver.switchTo().frame(WebElement);

切换之后--->driver.switchTo().defaultContent();回到默认内容页面(否则找不到元素)

window切换

操作另一个窗口页面的元素时,一定要注意先切换窗口的切换方式:传入要操作窗口的name或者句柄

driver.switchTo().window(name/Hnadle)

难点:如何切换句柄呢

        //由于跳转之后窗口的句柄值仍然不会改变,操作的滑盖式原来的窗口,故而要切换窗口
		Set<String> handles=driver.getWindowHandles();
		//对窗口集合进行遍历
		for(String handle:handles) {
			driver.switchTo().window(handle);
			//我如何知道窗口的真正句柄呢
			if(driver.getTitle().equals("百度新闻——海量中文资讯平台")) {
				break;
			}
		}
		//对百度新闻进行定位
		driver.findElement(By.id("ww")).sendKeys("window跳转");

select下拉框(必须是select标签

如果页面元素是一个下拉框,我们可以将此web元素封装为Select对象

·Select select =new Select(WebElement element);

Select对象常用api

select.getOptions():获取所有选项

select.selectByIndex(index):根据索引选中对应的元素

select.selectByValue(value):选择指定value值对应的选项

select.selectByVisible(text):选中文本值对应的选项

时间日期控件

1.控件没有限制手动输入,则直接调用sendKeys方法写入时间数据

2.控件有限制输入,则可以执行一段js来改变元素的value属性值

JavascriptExecutor jsExecutor=(JavascriptExecutor) driver

jsExecutor.executeScript();

鼠标操作

Actions类模拟鼠标键盘操作+perform方法执行

Actions actions =new Actions(WebElement element);//实例化actions对象

actions.方法.release().build().perform()

文件上传

1.直接使用sendKeys写入文件的路径(input标签,type为file)

2.必须使用第三方工具(比如autoit)

验证码

去除验证码

自动识别

万能验证码(推荐)

页面自动化测试(selenium+testng)

采用PO模式:

将页面抽象成为一个类:

  • 属性:url元素/元素定位表达式;
  • 方法(功能):业务流程操作

优点:高内聚低耦合(耦合只需要driver实例化)

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐