Как справиться с изменением абсолютного xpath? - PullRequest
0 голосов
/ 31 октября 2019

HTML:

<div class="component-multi-row-slide-title"> Cloth </div>

Xpath

/html/body/div/main/div/div/div[2]/div/div/div/div[1]/div/div***[4]***/div/div[2] the div[4] 

постоянно меняется. Если новый элемент появится в сети, разработчик изменит номер div.

Я хочу нажать «Ткань». Xpath постоянно меняется, когда добавляется новая категория.

Ответы [ 6 ]

1 голос
/ 31 октября 2019

Для начала использования абсолютного xpath есть определенные недостатки: например, при добавлении новых элементов xpath ранее идентифицированных элементов будет продолжать меняться. Следовательно, решением было бы использовать Относительный Xpath .

В соответствии с предоставленным вами HTML, чтобы щелкнуть элемент с текстом как Cloth , вы можете использовать следующее Стратегия локатора :

  • XPath A:

    //div[@class='component-multi-row-slide-title' and contains(., 'Cloth')]
    
  • XPath B:

    //div[@class='component-multi-row-slide-title' and normalize-space()='Cloth']
    
0 голосов
/ 31 октября 2019

Только для справки: XPath используется для поиска местоположения любого элемента на веб-странице с помощью структуры HTML DOM.

Недостаток абсолютного XPath заключается в том, что при внесении каких-либо изменений в путьэлемент, в котором происходит сбой XPath.

Таким образом, в этом случае можно использовать Относительные пути Xpath :

// div [содержит (text (), 'Cloth')] или // * [содержит (текст (), 'Ткань')]

// div [содержит (текст (), "Модные аксессуары")] или // * [содержит (текст (), «Модные аксессуары»)]

Как использовать: driver.findElement (By.xpath ("// div [содержит (текст (), 'Ткань')]"));

0 голосов
/ 31 октября 2019

В этом случае вам нужно использовать относительный xpath.

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

1>>driver.findElement(By.xpath("//div[contains(text(),'Cloth')]")).click();

2>>driver.findElement(By.xpath("//*[contains(text(),'Cloth')]")).click();

3>>driver.findElement(By.xpath("//div[@class='component-multi-row-slide-title']")).click();

Пустья знаю, существует ли такое же имя класса для других элементов.

0 голосов
/ 31 октября 2019

Я бы порекомендовал использовать настроенный xpath. Как указано ниже:

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

driver.findElement(By.xpath("//div[contains(text(), 'Fashion Acessories')]").click

Это будет работать наверняка. Не стесняйтесь, дайте мне знать, если что-то не так с xpath.

Спасибо

0 голосов
/ 31 октября 2019

Absolute Xpath: содержит полный путь от корневого элемента до элемента желания.

Relative Xpath: это больше похоже на начало, просто ссылаясь на нужный элемент и переходя из определенного местоположения.

Вы всегда используете Относительный путь для тестирования элемента. Причина в том, что если вы внесете какое-либо архитектурное изменение на веб-сайте, это изменение не повлияет на тестирование или выбор элемента.

Поэтому используйте относительный xpath, который выглядит следующим образом

WebElement cloth = driver.findElement(By.xpath("//div[normalize-space()='Cloth']"));
cloth.click();

Дайте мне знать, если это не поможет

0 голосов
/ 31 октября 2019

Вы пишете следующий код

driver.findElement(By.xpath("//div[normalize-space()='Cloth']").click

Приведенный выше код будет непосредственно идентифицировать элемент, а также он не будет хрупким по своей природе, когда разработчик изменяет элементы страницы.

...