Элемент с текстом не доступен для WebDriver, необходимо получить координаты текста
для последующего нажатия на кнопку содержащую данный элемент.
Для решения задачи подключил Teseract - на данный момент добился получения текста со всей страницы. Для получения координат использую код ниже. На строчке api.TessPageIteratorBegin(pi);
Выдает exception java.lang.Error:
Invalid memory access
at com.sun.jna.Native.invokeVoid(Native Method)
at com.sun.jna.Function.invoke(Function.java:367)
at com.sun.jna.Function.invoke(Function.java:315)
at com.sun.jna.Library$Handler.invoke(Library.java:212)
at com.sun.proxy.$Proxy9.TessPageIteratorBegin(Unknown Source)
TessAPI api = LoadLibs.getTessAPIInstance();
TessAPI.TessBaseAPI handle = api.TessBaseAPICreate();
String lang = "eng";
File toast = new File("src/test/ToastScreenShoots/image.png");
BufferedImage image = null;
try {
image = ImageIO.read(new FileInputStream(toast));
} catch (IOException e) {
e.printStackTrace();
}
ByteBuffer buf = ImageIOHelper.convertImageData(image);
File file = new File("src/test/ToastScreenShoots/image.png");
api.TessBaseAPIInit3(handle, "tessdata", lang);
TessAPI.TessResultIterator ri = api.TessBaseAPIGetIterator(handle);
TessAPI.TessPageIterator pi = api.TessResultIteratorGetPageIterator(ri);
api.TessPageIteratorBegin(pi);
System.out.println("Bounding boxes:\nchar(s) left top right bottom confidence font-attributes");
int height = image.getHeight();
do {
Pointer ptr = api.TessResultIteratorGetUTF8Text(ri, TessAPI.TessPageIteratorLevel.RIL_WORD);
String word = ptr.getString(0);
api.TessDeleteText(ptr);
float confidence = api.TessResultIteratorConfidence(ri, TessAPI.TessPageIteratorLevel.RIL_WORD);
IntBuffer leftB = IntBuffer.allocate(1);
IntBuffer topB = IntBuffer.allocate(1);
IntBuffer rightB = IntBuffer.allocate(1);
IntBuffer bottomB = IntBuffer.allocate(1);
api.TessPageIteratorBoundingBox(pi, TessAPI.TessPageIteratorLevel.RIL_WORD, leftB, topB, rightB, bottomB);
int left = leftB.get();
int top = topB.get();
int right = rightB.get();
int bottom = bottomB.get();
System.out.print(String.format("%s %d %d %d %d %f", word, left, top, right, bottom, confidence));
IntBuffer boldB = IntBuffer.allocate(1);
IntBuffer italicB = IntBuffer.allocate(1);
IntBuffer underlinedB = IntBuffer.allocate(1);
IntBuffer monospaceB = IntBuffer.allocate(1);
IntBuffer serifB = IntBuffer.allocate(1);
IntBuffer smallcapsB = IntBuffer.allocate(1);
IntBuffer pointSizeB = IntBuffer.allocate(1);
IntBuffer fontIdB = IntBuffer.allocate(1);
String fontName = api.TessResultIteratorWordFontAttributes(ri, boldB, italicB, underlinedB,
monospaceB, serifB, smallcapsB, pointSizeB, fontIdB);
boolean bold = boldB.get() == TessAPI.TRUE;
boolean italic = italicB.get() == TessAPI.TRUE;
boolean underlined = underlinedB.get() == TessAPI.TRUE;
boolean monospace = monospaceB.get() == TessAPI.TRUE;
boolean serif = serifB.get() == TessAPI.TRUE;
boolean smallcaps = smallcapsB.get() == TessAPI.TRUE;
int pointSize = pointSizeB.get();
int fontId = fontIdB.get();
System.out.println(String.format(" font: %s, size: %d, font id: %d, bold: %b," +
" italic: %b, underlined: %b, monospace: %b, serif: %b, smallcap: %b",
fontName, pointSize, fontId, bold, italic, underlined, monospace, serif, smallcaps));
} while (api.TessPageIteratorNext(pi, TessAPI.TessPageIteratorLevel.RIL_WORD) == TessAPI.TRUE);