Estoy tratando de hacer clic en el botón Guardar. HTML del botón Guardar:

<div class="button button--large ng-binding" ng-click="params.applyWrapper()">Save</div>

Ahora, cuando uso xpath relativo para obtener un clic, funciona bien. No aparece ningún error y hacer clic en este elemento es exitoso.

driver.findElement(webdriver.By.xpath(".//*[@id='navcontainer']/ons-page[4]/div[2]/div/ng-form/fieldset/ul/li[8]/div")).click();

Sin embargo, el uso de xpath dinámico como se indica a continuación produce un error "ElementNotVisibleError: elemento no visible"

driver.findElement(webdriver.By.xpath(".//div[contains(text(),'Save')]")).click();

¿Cuál podría ser la razón y cómo obtengo un clic en este elemento usando xpath dinámico?

0
Pawan Juyal 4 may. 2017 a las 09:15

2 respuestas

La mejor respuesta

La explicación de por qué apareció el error Elemento no visible sería que la página anterior también tiene un botón 'Guardar' y dado que en la mayoría de las implementaciones no destruimos la página anterior y solo la ocultamos, webdriver estaba localizando el botón Guardar en la página anterior pero podría no acceder a él ya que está oculto, por lo tanto, el elemento de error no es visible. El uso absoluto de xpath difiere efectivamente de los botones Guardar en la página anterior y actual, mientras que Dynamic xpath para ambos botones 'Guardar' es exactamente el mismo. (Dado que no hay ningún atributo que haga diferente a xpath).

driver.findElement(By.xpath("//*[text()='Save']")).click();

Ahora, necesitamos una manera de hacer que Dynamic xpath para ambos botones 'Guardar' sea diferente. Esto se puede hacer utilizando el método de ejes Xpath . En este método identificamos un elemento que precede o sigue al elemento al que se accede y escribimos un xpath con respecto a este elemento precedente / siguiente.

En mi caso, el botón 'Guardar' en la página actual está precedido por una etiqueta de entrada y el botón Guardar en la página anterior está precedido por una etiqueta de extensión. Esto me permite diferenciar el xpath para ambos botones de la siguiente manera:

Xpath para el botón Guardar en la página actual:

driver.findElement(By.xpath("//input[@name='defaults']//following::div[1]")).click();

// following :: div [1] en este xpath representa el botón 'Guardar' precedido por una etiqueta de entrada.

Xpath para el botón Guardar en la página anterior:

driver.findElement(By.xpath("//span[text()='Test']//following::div[1]")).click();

// following :: div [1] en este xpath representa el botón 'Guardar', precedido por una etiqueta span.

0
Pawan Juyal 9 may. 2017 a las 06:37

Como mencionaste esta xpath absoluta funcionó:

driver.findElement(webdriver.By.xpath(".//*[@id='navcontainer']/ons-page[4]/div[2]/div/ng-form/fieldset/ul/li[8]/div")).click();

Este xpath lógico también debería funcionar también:

driver.findElement(webdriver.By.xpath("//div[@class='button button--large ng-binding'][text()='Save']")).click();

Como se enfrenta a la excepción ElementNotVisibleError: element not visible, puede agregar algunos ExplicitWait para que el elemento sea visible y luego hacer clic de la siguiente manera:

 WebElement myElement = (new WebDriverWait(driver, 15)).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='button button--large ng-binding'][text()='Save']")));
 myElement.click();

Déjeme saber si esto le ayuda.

0
NarendraR 5 may. 2017 a las 09:50