章节十四、5- web页面的截图
一、以雅虎网站为例,当我们在登录时,输入错误的用户名然后点击“下一步”,用户名输入框会提示红色字体,这个时候我们就将页面进行截图。
http://commons.apache.org/proper/commons-io/download_io.cgi
1 package basicweb; 2 3 import java.io.File; 4 import java.util.concurrent.TimeUnit; 5 6 import org.apache.commons.io.FileUtils; 7 import org.junit.jupiter.api.AfterEach; 8 import org.junit.jupiter.api.BeforeEach; 9 import org.junit.jupiter.api.Test; 10 import org.openqa.selenium.By; 11 import org.openqa.selenium.Keys; 12 import org.openqa.selenium.OutputType; 13 import org.openqa.selenium.TakesScreenshot; 14 import org.openqa.selenium.WebDriver; 15 import org.openqa.selenium.WebElement; 16 import org.openqa.selenium.chrome.ChromeDriver; 17 18 19 20 class Screenshots { 21 22 WebDriver driver; 23 String url; 24 @BeforeEach 25 void setUp() throws Exception { 26 driver = new ChromeDriver(); 27 url = "https://login.yahoo.com/config/login?.src=fpctx&.intl=us&.lang=en-US&.done=https%3A%2F%2Fwww.yahoo.com"; 28 driver.manage().window().maximize(); 29 driver.manage().timeouts().implicitlyWait(2000,TimeUnit.SECONDS); 30 } 31 32 @Test 33 void test() throws InterruptedException { 34 driver.get(url); 35 // 查找到登录文本框,输入test 36 driver.findElement(By.xpath("//input[@name=\'username\']")).sendKeys("test"); 37 // 点击登录按钮 38 driver.findElement(By.xpath("//input[@id=\'login-signin\']")).sendKeys(Keys.ENTER); 39 } 40 41 // 创建一个获取随机字符串的方法用来给截图的内容图片赋值 42 // 在调用该方法时,列如length赋值是5,那么文件名的长度就为5,由5个字符组成 43 public static String getRandomString(int length) { 44 // StringBuilder 是一个可变的字符序列 45 StringBuilder sb = new StringBuilder(); 46 String characters = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPAZSXDCFVGBHNJMKL1234567890"; 47 // for循环从定义的characters字符串中随机取出指定length长度的字符串 48 for(int i = 0; i<length;i++) { 49 // Math.random()取0到1之间的一个随机数然后乘以characters字符串的长度,得到一个double类型的数据,因此要强制转换成int类型得到一个整数,成为characters字符串的索引 50 int index = (int)(Math.random() * characters.length()); 51 // 通过charAt获得字符串上索引的值,来作为append方法的参数 52 // append方法是为了把获取到的字符全部连接到一起,先取一个字符放到bulider缓存区中,然后再循环追加取剩下的值,直到满足length长度 53 sb.append(characters.charAt(index)); 54 } 55 // 然后将取到的字符串值返回 56 return sb.toString(); 57 } 58 59 @AfterEach 60 void tearDown() throws Exception { 61 Thread.sleep(2000); 62 // 截图首先需要一个文件名,调用上面定义的随机生成文件名的方法,.png表示文件的扩展名 63 String fileName = getRandomString(10)+".png"; 64 // 存放图片的路径 65 String directory = "C:\\Users\\acer\\Desktop\\"; 66 // 以文件的形式输出 67 // 把driver转换为TakesScreenshot类型 68 File sourceFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); 69 // 复制文件 70 FileUtils.copyFile(sourceFile,new File(directory+fileName)); 71 driver.quit(); 72 } 73 }
运行结果:成功截图且截图结果与预期结果一致
注意:(在实现截图功能的过程中遇到一个问题浪费了我一下午的时间)
雅虎用户名输入框在输入错误的用户名或者为空的情况下点击登录按钮,用户名输入框会出现红色的提示性文字。
一开始我使用的是click来进行点击,但始终未成功,
1 driver.findElement(By.xpath(“//input[@id=\’login-signin\’]”)).click();
然后我就想是不是定位有问题、farme标签等等情况导致我定位不成功,在查询资料时发现因为各个网站功能实现方式有差异,所以导致click对有些input标签不生效,而登录按钮正是input标签,于是我改用sendkeys发生Enter按键操作来实现,成功,nice。(需要导包keys包)
1 driver.findElement(By.xpath(“//input[@id=\’login-signin\’]”)).sendKeys(Keys.ENTER);
如果有不明白的小伙伴可以加群“555191854”问我,群里都是软件行业的小伙伴相互一起学习。