Как мы знаем, селен поддерживает стратегию нескольких локаторов для поиска элемента на веб-странице.
Но мое требование другое, у меня есть несколько сайтов, на которых локаторов, поддерживаемых селеном, недостаточно, чтобы найти элемент уникальным образом.
Поскольку селен позволяет создавать собственную стратегию локатора для поиска элемента, я пытаюсь создать локатор image , который мог бы найти элемент, используя base64 String
вспомогательного изображения как appium do.
Точки за локатор изображения:
- Запустить браузер с 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
из image
для поиска элемента с использованием координат.
Может ли кто-нибудь предложить мне лучший подход для решения этой задачи?