Estoy tratando de automatizar la aplicación, tratado primero en encontrar XPath o CSS localizadores que no pueden encontrar ninguna apariencia de marco también dentro del elemento.
Soy capaz de manejar el uso de JavaScript, pero no puede entrar en texto completo en el buscador, que está recortando un poco de texto ,, por favor, ayúdame.
JavaScript que probé.
((JavascriptExecutor)driver).executeScript("return document.querySelector('#app').shadowRoot.querySelector('#base > wego-search-form').shadowRoot.querySelector('div > wego-hotel-search-form').shadowRoot.querySelector('#loc').shadowRoot.querySelector('#item0 > div.disable-select.city-country-name').click();");
((JavascriptExecutor)driver).executeScript("return document.querySelector('#app').shadowRoot.querySelector('#base > wego-search-form').shadowRoot.querySelector('div > wego-hotel-search-form').shadowRoot.querySelector('#dates').shadowRoot.querySelector('#depart').shadowRoot.querySelector('#btn').click();");
Mi escenario quiero hacer clic en el formulario de búsqueda e introduzca algunos detalles de destino, si es posible alguna forma de manejar este caso el uso de localizadores me sugieren
Sombra DOM elementos se utilizan en este sitio web. Sombra DOM proporciona encapsulación para el código JavaScript, CSS y plantillas en un componente Web.
Sombra DOM permite oculta árboles DOM para ser conectados a los elementos en el árbol DOM regulares - esta sombra del árbol DOM se inicia con una raíz sombra, debajo de la cual se puede conectar a cualquier elemento que quiera, de la misma manera como el DOM normal.
Consulte este Para obtener detalles acerca de él o para más detalles Google él.
Ahora manejar Sombra elemento de toma de referencia desde este blog . He intentado el siguiente código para introducir texto como se esperaba y su trabajo para mí.
public static WebDriver driver;
public static void main(String[] args){
System.setProperty("webdriver.chrome.driver", "driver_path");
driver = new ChromeDriver();
driver.get("https://www.wego.com.my/hotels");
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
driver.manage().window().maximize();
WebElement root1 = driver.findElement(By.id("app"));
WebElement shadowRoot1 = expandRootElement(root1);
WebElement root2 = shadowRoot1.findElement(By.tagName("wego-search-form"));
WebElement shadowRoot2 = expandRootElement(root2);
WebElement root3 = shadowRoot2.findElement(By.tagName("wego-hotel-search-form"));
WebElement shadowRoot3 = expandRootElement(root3);
WebElement root4 = shadowRoot3.findElement(By.id("loc"));
WebElement shadowRoot4 = expandRootElement(root4);
shadowRoot4.findElement(By.cssSelector("div.root-container div.container")).click();
WebElement element = shadowRoot4.findElement(By.id("searchKeywordInput"));
Actions action = new Actions(driver);
action.click(element).sendKeys(Keys.chord(Keys.CONTROL, "a"));
element.sendKeys(Keys.DELETE);
element.sendKeys("narendra");
}
public static WebElement expandRootElement(WebElement element) {
WebElement newElement = (WebElement) ((JavascriptExecutor) driver).executeScript("return arguments[0].shadowRoot", element);
return newElement;
}
Actualizado
Como una alternativa de sendKeys()
, JavascriptExecutor
se puede utilizar para establecer el valor del cuadro de texto. Uso continuación Código
WebElement element = shadowRoot4.findElement(By.id("searchKeywordInput"));
JavascriptExecutor javascriptExecutor = (JavascriptExecutor) driver;
javascriptExecutor.executeScript("arguments[0].value='Your Text Goes Here';", element);
He probado esto tantas tiempo y esto está trabajando muy bien en cada caso.
Nota: el uso JavascriptExecutor
no puede desencadenar la sugerencia automática de resultados de búsqueda.