Java_Selenium

getText()    通常指的是

aaa

中的aaa 

对于

这种  就需要getAttribute("text")去获取

弹出对话框(Popup dialogs)
Alert alert = driver.switchTo().alert();
alert.accept();  //确定
alert.dismiss();  //取消
alert.getText(); //获取文本

表单(Form)
Form中的元素的操作和其它的元素操作一样,对元素操作完成后对表单的提交可以:
WebElement approve = driver.findElement(By.id("approve"));
approve.click();

approve.submit();//只适合于表单的提交        

上传文件
上传文件的元素操作:
WebElement adFileUpload =driver.findElement(By.id("WAP-upload"));
String filePath = "C:\test\\uploadfile\\media_ads\\test.jpg";
adFileUpload.sendKeys(filePath);

Windows 和 Frames之间的切换
driver.switchTo().defaultContent();     //返回到最顶层的frame/iframe
driver.switchTo().frame("leftFrame");    //切换到某个frame:
driver.switchTo().window("windowName"); //切换到某个window

调用Java Script
Web driver对Java Script的调用是通过JavascriptExecutor来实现的,例如:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("JS脚本");

超时设置
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//识别元素时的超时时间
driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);//页面加载时的超时时间
driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);  //异步脚本的超时时间

public class TestSelenium {
    WebDriver webDriver = null;
    @Before
    public void Setup(){
        File chromeDriverPath = new File("D:\\Selenium\\webdriver\\chromedriver.exe");
        System.setProperty("webdriver.chrome.driver", chromeDriverPath.getAbsolutePath());
        webDriver = new ChromeDriver();
    }
 @Test
    public void testWait(){
        webDriver.get("http://www.baidu.com");
        WebElement webElement = webDriver.findElement(By.name("wd"));
        webElement.sendKeys("Selenium 2");
        webElement.submit();        
        //1. 显示等待
        (new WebDriverWait(webDriver, 10)).until(new ExpectedCondition() {
            @Override
            public Boolean apply(WebDriver driver) {
                // TODO Auto-generated method stub
                return driver.getTitle().toLowerCase().startsWith("selenium");
            } 
        });
        System.out.println("Page title is:"+webDriver.getTitle());
        //1.1显示等待-2
       WebDriverWait wait = new WebDriverWait(driver,5);
        wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("")));
        webDriver.navigate().back();
        //1.2显示等待-3
        WebDriverWait wait = new WebDriverWait(driver,//等待秒数//);
        wait.until(ExpectedConditions.visibilityOfElementLocated(//元素位置//));
        visibilityOfElementLocated,意思是只要被找的元素出现就停止等待。
        //2. 隐式等待
        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        webDriver.findElement(By.xpath("//*[@id=\"u1\"]/a[1]")).click();
        webDriver.quit();
        可隐式等待的代码只写了一遍。虽然只是一遍,可每次执行driver.findElement()的时候          如果当时定位不到要找的元素都会执行一下这句
    }
}
 

显式等待可以自定义等待的条件,用于更加复杂的页面等待条件

(1)页面元素是否在页面上可用和可被单击:elementToBeClickable(By locator)

(2)页面元素处于被选中状态:elementToBeSelected(WebElement element)

(3)页面元素在页面中存在:presenceOfElementLocated(By locator)

(4)在页面元素中是否包含特定的文本:textToBePresentInElement(By locator)

(5)页面元素值:textToBePresentInElementValue(By locator, java.lang.String text)

(6)标题 (title):titleContains(java.lang.String title)

只有满足显式等待的条件满足,测试代码才会继续向后执行后续的测试逻辑

如果超过设定的最大显式等待时间阈值, 这测试程序会抛出异常。
————————————————
版权声明:本文为CSDN博主「天驱蚊香」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42123456/article/details/114474744

获取元素坐标
在“Console”中输入 'document.getElementById('元素ID').getBoundingClientRect()'后,回车
 

https://www.iteye.com/blog/m635674608-2173144
1. 利用 Selenium 自带的方法截图
getScreenshotAs() 函数可以返回 BASE64、BYTES 或 FILE 类型的数据 
public static void captureScreen(WebDriver driver,String screenName) throws IOException{          //判断是否存在screenpath目录 if(!(new File(screenpath).isDirectory())){ new         File(screenpath).mkdir(); } File screenShotFile =         ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);          FileUtils.copyFile(screenShotFile, new File(screenpath+screenName+".jpg"));
}
2.利用 Robot 类的 createScreenCapture() 方法
public static void captureScreen(String screenName, int x, int y, int width, int height) {
        try {
         BufferedImage capture = null; Rectangle area = new Rectangle(x, y, width, height);          Robot robot = new Robot(); capture = robot.createScreenCapture(area);
         String fn = screenpath + screenName + ".jpg";
         FileOutputStream out = new FileOutputStream(fn);
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);                                  encoder.encode(capture);
        out.flush();
        out.close();
        } catch (Exception e) {
        e.printStackTrace();
        }
}
对于某些气泡悬浮框,如 title 属性值,需要将鼠标悬浮在元素上才可以显示出来。采用 Selenium 的 Actions 类去模拟鼠标操作,可以解决一些通过 javascript、css 控制的鼠标移动、悬浮操作 ,但是对于 title 这样的气泡悬浮框却无能为力,因为 Actions 方法只是模拟鼠标操作,而 title 属性值需要在真实的鼠标悬浮在元素上时才会显示出来。此时,可以先使用 Robot 类的 mouseMove() 方法将鼠标移到指定屏幕位置,再进行截图。
3. 在 Robot 类的 mouseMove() 方法中应用 Selenium 获取到的点坐标
Robot robot = newRobot();
Point point = element.getLocation();
robot.mouseMove(point.x+55, point.y+90);

mouseMove() 中的点坐标为 Selenium 获取到的元素的屏幕坐标,而通过 getLocation() 方法获得的元素坐标为元素相对于浏览器内的 document 对象的坐标,所以需要进行微调。

由于 Robot 类操作的是一些操作系统事件,所以在某些系统(如 X-Window 系统)中如果 Robot 类访问鼠标、键盘的操作需要特定权限,那么可能会抛出 AWTException。然而,在多平台上实现截图并不是我们在本文中需要考虑的内容。利用 Robot 类的截图方法可以截取指定区域的屏幕,相比第一种方法更加灵活,功能也更加强大。
 

对于页面中某些气泡悬浮框(如图 1 中的“到百度首页”字符串),如 title 和 alt 属性值,虽然使用 Robot 可以截取到,但是需要调节坐标位置。在我们实际应用中,由于我们一般都是通过 Remote Desktop Connection Manager 连接多台远程虚拟机,屏幕的大小有时会发生改变,因而元素的坐标位置也经常需要调节。

图 1. 气泡悬浮框示例

实现思路

所以对于此类情况,我们可以通过另外一种方式解决,即解析网页页面,取出 title 属性值,并根据 title 信息绘制成图片,最后将绘制好的图片添加到原来的图中并返回整张图片。从理论上讲,所有的页面元素,我们都可以通过此方法实现截图。实现方法如清单 4 所示。

清单 4. 抓取完整的屏幕截图

public static void captureFlyover(WebDriver driver,String xpath,String screenName) throws Exception{
    BufferedImage img;
    BufferedImage img1;
    //img1为抓取的不包含tooltip的屏幕截图
    img1 = gsscScreenshotImage(driver);
    //img为将悬浮框添加到img1后返回的屏幕截图
	img = gsscAddTooltip(driver.findElement(By.xpath(xpath)), img1);
	ImageIO.write(img, "png", new File(screenpath+screenName+".jpg"));
}

其中, gsscScreenshotImage() 方法调用的是第一种方式中的 getScreenshotAs() 方法。接着,我们来看一下 gsscAddTooltip() 的实现方式。我们首先在 gsscCreateTooltip() 创建了 tooltip 图像。根据传入的 Selenium 获取到的 element 对象,我们可以获取到元素的 title 和 font-family 等属性值以及元素的坐标位置。根据这些信息,我们创建出一个 img 图像。我们将图像的背景色设置为 #F5FCDE。但为了更加逼真,我们还可以通过 getCssValue() 方法获取到更多和元素有关的信息,如 background、border、padding 等等。

清单 5. 创建悬浮框

public static Point text_location;
	
//获取title属性值,创建tooltip
public static BufferedImage gsscCreateTooltip (WebElement element, int size) throws Exception{
	
	String text = element.getAttribute("title");
	String text_font = element.getCssValue("font-family");
	text_location = element.getLocation();
	int tooltip_h = size+7;
	
	BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
	Graphics2D tooltip = img.createGraphics();
        //设置悬浮框的宽度为文本的宽度加上7像素
	int tooltip_w = tooltip.getFontMetrics().stringWidth(text)+7;
	img = new BufferedImage(tooltip_w, tooltip_h, BufferedImage.TYPE_INT_ARGB);
	tooltip = img.createGraphics();
	//将创建图像的文字字体设置为从页面元素中获取到的文字字体
	tooltip.setFont(new Font(text_font, Font.PLAIN, size));
	tooltip.setPaint(Color.decode("#F5FCDE"));
	tooltip.fillRect(0, 0, tooltip_w, tooltip_h);
	tooltip.setPaint(Color.black);
	tooltip.draw3DRect(0, 0, tooltip_w-1, tooltip_h-1, true);
        //将文本绘制到图像上,drawString()并不支持文本的自动换行,当需打印的文                         
        //本太长时,需要自己实现自动换行
	tooltip.drawString(text,3,tooltip_h-5);
	tooltip.dispose();
	return img;
}


然后,我们在 gsscAddTooltip() 中进行判断,如果我们只想得到仅包含 tooltip 的图片,那么我们直接利用 tooltip 这个 BufferedImage 对象绘出图像并返回。否则将 tooltip 绘制在 img 中指定元素的坐标位置附近(以元素中心为坐标,向 x 和 y 方向分别偏移 20px)。

清单 6. 将悬浮框添加到 Selenium 截取的图片中

public static BufferedImage gsscAddTooltip (WebElement element, BufferedImage img) throws Exception{	
	// 创建tooltip
	BufferedImage tooltip = gsscCreateTooltip(element, 12);
	int tooltip_w = tooltip.getWidth();
	int tooltip_h = tooltip.getHeight();
	BufferedImage buffImg;
	Graphics2D graphic;
	
	if (img != null){
		// 将tooltip添加到img中
		int img_w = img.getWidth();
		int img_h = img.getHeight();
		
		if (img_w >= (tooltip_w+text_location.getX())){
			buffImg = new BufferedImage(img_w, img_h+tooltip_h+2, BufferedImage.TYPE_INT_ARGB);
		}else{
		buffImg = new BufferedImage(tooltip_w+text_location.getX()+10, img_h+tooltip_h+2, BufferedImage.TYPE_INT_ARGB);
		}
		graphic = buffImg.createGraphics();
		graphic.drawImage(img, 0, 0, null);
		graphic.drawImage(tooltip, text_location.x+20, text_location.y+20, null);
	}else{
		buffImg = new BufferedImage(tooltip_w+3, tooltip_h+2, BufferedImage.TYPE_INT_ARGB);
		graphic = buffImg.createGraphics();
		graphic.drawImage(tooltip, 3, 1, null);
	}
	graphic.dispose();
	return buffImg;
}

图 2. 利用第三种方式截到的图(仅显示部分)

需要注意的问题

利 用该方法截取百度页面(http://www.baidu.com/s?wd=mytest&rsv_bp=0&ch=& tn=baidu&bar=&rsv_spt=3&ie=utf-8&rsv_sug3=1& inputT=7063)中的百度 logo 的 title“到百度首页”这个字符串的时候,截到的却是乱码。利用 FireBug 查看该网页的源代码才发现,原来该元素的字体被设置成了 arial。当页面文字被设置成某些西方字体如 arial 这样的字体时,调用 drawString() 方法打印中文字符会出现乱码。这时,只要将字体改为某些支持的字体就可以了,如:tooltip.setFont(newFont("宋体", Font.PLAIN, size));

图 3. 百度搜索结果页面的字体

图 4. 修改字体前后截图对比(仅显示部分)

对动态生成图片方法的改进

在 captureFlyover() 函数中,页面指定元素是通过 xpath 来获取的,该实例只返回了一个页面元素。如有需要,可以根据 xpath 表达式获取到所有符合条件的页面元素,然后将这些页面元素逐一添加到截图中,从而实现在同一个页面中获取到多个悬浮框的效果。但这种方法面临的另一个问题就是,多个悬浮框有可能会重叠,需要注意每个悬浮框在截图中显示的具体位置。

清单 7. 利用 xpath 获取多个页面元素

 //driver.findElements(By.xpath(xpath)会返回符合xpath表达式的所有元素,而 
 //driver.findElement(By.xpath(xpath)会返回符合xpath表达式的第一个元素
 img = gsscAddTooltips(driver.findElements(By.xpath(xpath)), img1);

通过解析网页动态生成图片,需要编写比较多的代码,实现难度相对比较大,一般只有在需要大量的截取某同类型的图片且无法通过 getScreenshotAs() 方法实现时才会选择。

结束语

本文通过示例代码,介绍了在用 Selenium 进行自动化测试时可以选用的三种网页截图方法。三种方法,各有优劣,可以适用在不同场景。读者也可以利用 JNI,通过调用第三方组件的方式来实现网页截图。但由于我们对性能并没有太高的要求,所以在实际应用中并未采用这种做法,这里也不再多述。

http://www.ithov.com/linux/131668_2.shtml

你可能感兴趣的:(网络安全,java,selenium,开发语言)