java - test - Ubicación del elemento de selenio
selenium tutorial java (1)
¿Hay una manera fácil de encontrar un elemento secundario de otro elemento (ambos elementos se han localizado utilizando una PageFactory)? Tenemos un conjunto de contenedores que contienen muchos módulos, y me gustaría asegurarme de que se muestren en sus ubicaciones correctas.
La API solo parece tener el siguiente método:
webElement.findElement(s).(By by);
¿Hay una manera fácil de hacer lo siguiente?
webElement.findElement(s)(WebElement webElement);
o mejor:
webElement.contains(WebElement webElement);
Finalmente obtuve lo que necesitas. Mi mejor solución sería algo en el camino de:
public static void assertContains(WebElement outerElem, WebElement innerElem) {
// get borders of outer element
Point outerLoc = outerElem.getLocation();
Dimension outerDim = outerElem.getSize();
int outerLeftX = outerLoc.getX();
int outerRightX = outerLeftX + outerDim.getWidth();
int outerTopY = outerLoc.getY();
int outerBottomY = outerTopY + outerDim.getHeight();
// get borders of inner element
Point innerLoc = innerElem.getLocation();
Dimension innerDim = innerElem.getSize();
int innerLeftX = innerLoc.getX();
int innerRightX = innerLeftX + innerDim.getWidth();
int innerTopY = innerLoc.getY();
int innerBottomY = innerTopY + innerDim.getHeight();
// assures the inner borders don''t cross the outer borders
final String errorMsg = "ughh, some error message";
final boolean contains = (outerLeftX <= innerLeftX)
&& (innerRightX <= outerRightX)
&& (outerTopY <= innerTopY)
&& (innerBottomY <= outerBottomY);
assertTrue(errorMsg, contains);
}
... funciona solo si ninguno de esos contenedores se superpone. Si lo hacen, probaré alguna magia oscura y salvaje con innerElem.getTag()
y getText()
y getText()
si el texto externo contiene el elemento interno. Una forma de hacerlo:
public static void assertContains(WebElement outer, WebElement inner) {
// e.g. //div[text()=''some text in inner element'']
final String findInner = ".//" + inner.getTagName() + "[text()=''" + inner.getText() + "'']";
try {
outerElem.findElement(By.xpath(findInner));
} catch (NoSuchElementException ignored) {
fail("Some horrible message! We are all doomed!");
}
// passed
}
...o algo similar. Es posible que normalize-space () o contains () (o ambos) sean necesarios debido a etiquetas en etiquetas en etiquetas en ...
Y, por supuesto, esto todavía está adivinando. El primer método puede tener falsos positivos y negativos (pero me gusta más según mis necesidades), el segundo solo debe tener falsos positivos. Puede combinarlos o inventar algo usted mismo (por ejemplo, utilizando Reflection
como ya ha indicado).