select - how - xpath selenium java
Seleccionar elemento principal del elemento conocido en Selenio (7)
Tengo un cierto elemento que puedo seleccionar con Selenium 1.
Lamentablemente, necesito hacer clic en el elemento principal para obtener el comportamiento deseado. El elemento que puedo ubicar fácilmente tiene un atributo que no se puede seleccionar, lo que lo hace inactivo para hacer clic. ¿Cómo navego hacia arriba con XPath ?
Echa un vistazo a los posibles ejes XPath , probablemente estés buscando parent
. Dependiendo de cómo encuentre el primer elemento, puede ajustar el xpath para eso.
Alternativamente, puede probar la sintaxis de doble punto , que selecciona el padre del nodo actual.
Esto podría ser útil para otra persona: el uso de esta muestra html
<div class="ParentDiv">
<label for="label">labelName</label>
<input type="button" value="elementToSelect">
</div>
<div class="DontSelect">
<label for="animal">pig</label>
<input type="button" value="elementToSelect">
</div>
Si, por ejemplo, quiero seleccionar un elemento en la misma sección (por ejemplo, div) como una etiqueta, puede usar esto
//label[contains(., ''labelName'')]/parent::*//input[@value=''elementToSelect'']
Esto solo significa que busque una etiqueta (podría ser algo como a
, h2
) llamada labelName
. Navegue al padre de esa etiqueta (es decir, div class="ParentDiv"
). Busque dentro de los descendientes de ese padre para encontrar cualquier elemento hijo con el valor de elementToSelect
. Con esto, no seleccionará el segundo elementToSelect
seleccionar con DontSelect
div como padre.
El truco es que puede reducir las áreas de búsqueda de un elemento navegando primero por el elemento primario y luego buscando el elemento que necesita en el descendiente de dicho elemento primario. Otra sintaxis como following-sibling::h2
también se puede usar en algunos casos. Esto significa el siguiente elemento hermano h2
. Esto funcionará para elementos en el mismo nivel, teniendo el mismo padre.
Hay un par de opciones allí. El código de muestra está en Java, pero un puerto a otros idiomas debería ser sencillo.
JavaScript:
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
"return arguments[0].parentNode;", myElement);
XPath:
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = myElement.findElement(By.xpath(".."));
Obtención del controlador del WebElement
Nota: Como puede ver, para la versión de JavaScript necesitará el driver
. Si no tiene acceso directo a él, puede recuperarlo desde WebElement
usando:
WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();
Poco más sobre los XPath axes
Digamos que tenemos la siguiente estructura HTML
:
<div class="third_level_ancestor">
<nav class="second_level_ancestor">
<div class="parent">
<span>Child</span>
</div>
</nav>
</div>
-
//span/parent::*
- devuelve cualquier elemento que sea directo padre.
En este caso, la salida es <div class="parent">
-
//span/parent::div[@class="parent"]
- devuelve el elemento padre solo del tipo de nodo exacto y solo si el predicado especificado es True.
Salida: <div class="parent">
-
//span/ancestor::*
- devuelve todos los antepasados (incluido el padre).
Salida: <div class="parent">
, <nav class="second_level_ancestor">
, <div class="third_level_ancestor">
...
-
//span/ancestor-or-self::*
- devuelve todos los antepasados y el elemento actual en sí.
Salida: <span>Child</span>
, <div class="parent">
, <nav class="second_level_ancestor">
, <div class="third_level_ancestor">
...
-
//span/ancestor::div[2]
- devuelve el segundo ancestro (comenzando desde el padre) de tipodiv
.
Salida: <div class="third_level_ancestor">
Podemos seleccionar la etiqueta principal con la ayuda de Selenium de la siguiente manera:
driver.findElement(By.xpath("//table[@id=''abc'']//div/nobr[.=''abc'']/../.."));
esto te ayudará a encontrar al abuelo del Elemento conocido. Simplemente elimine uno (/ ..) para encontrar el elemento primario inmediato.
Me gusta:
driver.findElement(By.xpath("//table[@id=''abc'']//div/nobr[.=''abc'']/..));
Hay otras formas de implementar esto, pero funcionó bien para mí.
Puede hacer esto usando / parent :: node () en xpath. Simplemente agregue / parent :: node () a los elementos secundarios xpath.
Por ejemplo: Let xpath of child element is childElementXpath .
Entonces xpath de su antecesor inmediato sería childElementXpath / parent :: node () .
Xpath de su próximo ancestro sería childElementXpath / parent :: node () / parent :: node ()
y así..
Además, puede navegar hasta un ancestro de un elemento usando ''childElementXpath/ancestor::*[@attr="attr_value"]''
. Esto sería útil cuando tiene un elemento secundario conocido que es único pero tiene un elemento principal que no puede identificarse de manera única.
consideremos su dom como
<a>
<!-- some other icons and texts -->
<span>Close</span>
</a>
Ahora que debe seleccionar la etiqueta padre ''a'' basada en el texto <span>
, luego use
driver.findElement(By.xpath("//a[.//span[text()=''Close'']]"));
Explicación: Seleccione el nodo según el valor del nodo hijo