我们知道selenium支持多个定位器策略来查找网页上的元素。
但我的要求不同,我有一些网站,其中 selenium 支持的任何定位器都不足以唯一地找到一个元素。
由于 selenium 提供了创建自己的自定义定位器策略来查找元素的便利,我正在尝试创建图像定位器,它可以像appium一样使用子图像的base64 来查找元素。String
图像定位器的要点:
使用 URL 启动浏览器
截取页面截图
从屏幕截图中检测子图像的x , y位置
使用页面中的x , y位置查找元素
为了完成这项任务,我正在创建自定义Image
定位器,如下所示:
public class ByImage extends By {
String imageBase64String
/**
* @param imageBase64String
*/
public ByImage(String imageBase64String) {
this.imageBase64String = imageBase64String
}
@Override
public List<WebElement> findElement(SearchContext context) {
List<WebElement> els = findElements(context)
if (els) {
return els.get(0)
}
throw new NoSuchElementException("Element not found")
}
@Override
public List<WebElement> findElements(SearchContext context) {
//Get current screenshot
byte[] screenshotByte = ((TakesScreenshot)context).getScreenshotAs(OutputType.BYTES))
byte[] subImgToFindByte = DatatypeConverter.parseBase64Binary(imageBase64String)
//Convert buffred image to get height and width of subimage
BufferedImage bufferedSubImgToFind = ImageIO.read(new ByteArrayInputStream(subImgToFindByte ));
//Here I need a mechanism to get coordinates of sub image from screenshot
//Suppose I able to find x, y
double x
double y
//Now find element using coordinates
//Now calculate center point
int centerX = int(x + (bufferedSubImgToFind.getWidth() / 2))
int centerY = int(y + (bufferedSubImgToFind.getHeight() / 2))
JavascriptExecutor js = ((JavascriptExecutor)context)
return js.executeScript("return document.elementsFromPoint(arguments[0], arguments[1]);", centerX, centerY)
}
}
现在测试用例如下:
WebDriver driver = new ChromeDriver()
driver.get("<URL>")
WebElement elementByImage = driver.findElement(new ByImage("<Base64 String of the subimage>"))
除了一个更好的库来检测subimage来自 an 的精确坐标image以使用坐标查找元素之外,我能够实现所有功能。
谁能建议我更好的方法来完成这项任务?
慕娘9325324
慕虎7371278
相关分类