Как найти сложный тег без имени или значения идентификатора? - PullRequest
0 голосов
/ 08 ноября 2018

Привет, пожалуйста, помогите мне найти путь к этому

<button _ngcontent-c27="" aria-label="VALIDATE" color="primary" fxflex="" mat-raised-button="" type="submit" class="mat-raised-button mat-primary" style="flex: 1 1 0%; box-sizing: border-box;"><span class="mat-button-wrapper"> VALIDATE </span><div class="mat-button-ripple mat-ripple" matripple=""></div><div class="mat-button-focus-overlay"></div></button>

но как я копирую xpath

/html/body/app-root/app-side-nav/mat-sidenav-container/mat-sidenav-content/main/app-otp/app-page-container/div/form/div/div/form/div/div[1]/button

тогда, когда я использую его, ошибка консоли NoSuchElementException

это мой код в селене, спасибо в Advace

driver.findElement(By.xpath("/html/body/app-root/app-side-nav/mat-sidenav-container/mat-sidenav-content/main/app-otp/app-page-container/div/form/div/div/form/div/div[1]/button")).click();

Кнопка HTML, пожалуйста, нажмите

Ответы [ 5 ]

0 голосов
/ 13 ноября 2018

Требуемый элемент является элементом Angular , поэтому для определения местоположения (и, возможно, для вызова click()) вы должны заставить WebDriverWait для желаемого элемента стать активируемым и вы можете использовать одно из следующих решений:

  • cssSelector:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("button.mat-raised-button.mat-primary[aria-label='VALIDATE']>span.mat-button-wrapper"))).click();
    
  • xpath

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@class='mat-raised-button mat-primary' and @aria-label='VALIDATE']/span[@class='mat-button-wrapper']"))).click();
    

Обновление

Когда вы сталкиваетесь с ошибкой ... неизвестная ошибка: Элемент не активен в точке ... , вы можете использовать любое из следующих решений:

  • cssSelector

    WebElement my_css_element = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("button.mat-raised-button.mat-primary[aria-label='VALIDATE']>span.mat-button-wrapper")));
    ((JavascriptExecutor)driver).executeScript("arguments[0].click();", my_css_element);
    
  • xpath:

    WebElement my_xpath_element = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@class='mat-raised-button mat-primary' and @aria-label='VALIDATE']/span[@class='mat-button-wrapper']")));
    ((JavascriptExecutor)driver).executeScript("arguments[0].click();", my_xpath_element);
    

Ссылки

Вы можете найти соответствующее обсуждение в

0 голосов
/ 08 ноября 2018

Во-первых, на практике лучше использовать относительный xpath, он поможет вам повторно использовать ваш код при добавлении новых изменений.

Во-вторых, если нет идентификатора, имени или какого-либо определенного локатора элемента для обработки, тогда вы должны попробовать атрибут, такой как

`//button[contains(text(),'Validate')]`

`//button[@type='submit']`

//button[@aria-label='VALIDATE'] и т. Д.

0 голосов
/ 08 ноября 2018

найти с использованием нескольких атрибутов [@type=... and @class=...]

//button[@type='submit' and @class='mat-raised-button mat-primary']
0 голосов
/ 08 ноября 2018

Я думаю, что вы пытаетесь автоматизировать сайт, построенный на угловой основе. В угловых же div используется для нескольких целей. Разработчики просто меняют привязку и используют одну и ту же кнопку для нескольких целей.

Если вы предоставите полную HTML-страницу, это будет очень полезно.

Просто проверьте, что может помочь несколько вещей:

  1. Веб-элемент виден на странице. (Css свойства, такие как display: ни один не заставляет элемент исчезать со страницы. Он все еще присутствует в DOM, но веб-драйвер не может его найти)

  2. Не загружается из jquery или ajax. если да, то, возможно, вам нужно добавить ожидание веб-драйвера.

Точное решение зависит от вашей полной веб-страницы.

0 голосов
/ 08 ноября 2018

Я надеюсь, что эти три помогает,

//button[@type='submit']
//*[contains(@type,'submit')]
//button[contains(text(),'VALIDATE')]

если не пытаться опубликовать HTML-код здесь, так что это будет полезно, или, проверьте эту статью, попробуйте больше о себе - https://www.guru99.com/xpath-selenium.html

...