Pregunta Seleccionar elemento principal del elemento conocido en Selenio


Tengo un cierto elemento que puedo seleccionar con Selenio 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?


73
2017-12-20 15:18


origen


Respuestas:


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(".."));

Obteniendo el controlador del WebElement

Nota: Como puede ver, para la versión de JavaScript necesitará la driver. Si no tiene acceso directo a él, puede recuperarlo de la WebElement utilizando:

WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();

118
2017-08-01 18:21



Echa un vistazo a la posible Ejes XPath, probablemente estés buscando parent. Dependiendo de cómo encuentre el primer elemento, puede ajustar el xpath para eso.

Alternativamente puedes probar el sintaxis de doble punto, .. que selecciona el padre del nodo actual.


13
2017-12-20 16:01



Poco más sobre XPath axes

Digamos que tenemos a continuación HTML estructura:

<div class="third_level_ancestor">
    <nav class="second_level_ancestor">
        <div class="parent">
            <span>Child</span>
        </div>
    </nav>
</div>
  1. //span/parent::* - devoluciones alguna elemento que es padre directo.

En este caso, la salida es <div class="parent"> 

  1. //span/parent::div[@class="parent"] - devuelve el elemento padre solamente del tipo de nodo exacto y solamente si el predicado especificado es verdadero.

Salida: <div class="parent"> 

  1. //span/ancestor::* - devoluciones todas antepasados ​​(incluido el padre).

Salida: <div class="parent">, <nav class="second_level_ancestor">, <div class="third_level_ancestor">...

  1. //span/ancestor-or-self::* - devoluciones todas antepasados y elemento actual en sí.

Salida: <span>Child</span>, <div class="parent">, <nav class="second_level_ancestor">, <div class="third_level_ancestor">...

  1. //span/ancestor::div[2] - devuelve el segundo ancestro (comenzando desde el padre) de tipo div.

Salida: <div class="third_level_ancestor">


12
2017-08-19 09:16



consideremos su dom como

<a>
<!-- some other icons and texts -->
<span>Close</span>
</a>

Ahora que debe seleccionar la etiqueta padre 'a' en función de <span> texto, luego uso

driver.findElement(By.xpath("//a[.//span[text()='Close']]"));

Explicación: Seleccione el nodo según el valor del nodo hijo


9
2018-03-23 17:04



Esto podría ser útil para otra persona: Usando 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 gustarle a, h2) llamado labelName. Navegue al padre de esa etiqueta (es decir div class="ParentDiv") Buscar dentro de los descendientes de ese padre para encontrar cualquier elemento hijo con el valor de elementToSelect. Con esto, no seleccionará el segundo elementToSelect 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.


4
2018-01-25 14:16



Puedes hacer esto usando / parent :: node () en el xpath. Simplemente anexar / parent :: node () a los elementos secundarios xpath.

Por ejemplo: Permitir que xpath del elemento secundario sea 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 a un ancestro de un elemento utilizando '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.


0
2017-12-08 04:38



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í.


0
2017-09-11 09:29