Проблема Xpath в расположении элемента - PullRequest
0 голосов
/ 11 марта 2019

Я получаю очень длинный xpath для выбранного элемента.Есть ли способ его укоротить?Это xpath, который я получаю:

// li [@ class = 'menu_men 1-уровень hasChild'] // div [содержит (@ класс, 'уровень-2')]] //DIV [@ CLASS = 'меню-обертку'] // уль [@ класс = 'уровень-2'] // Ли [= @ класс '1 уровня'] // DIV [@ класс = 'уровень-3']// ul [@ class = 'level-3'] // li // a [@ class = 'level-3'] [содержит (text (), 'Socks')]

Это URL-адрес: Calvin Klein Singapore Я завис над «МУЖЧИНАМИ», появится раздел аксессуаров, а затем наведите «Носки», чтобы получить xPath.

Я получаю следующее исключение в моем коде, и мне интересно, может ли длинная xpath быть одной из причин:

org.openqa.selenium.NoSuchElementException: нет такогоelement: Невозможно найти элемент: {"method": "xpath", "selector": "// li [@ class = 'first menu_men 1-уровень hasChild'] // div [содержит (@ класс, 'уровень-2')] // DIV [@ класс =' меню-обертку '] // уль [@ класс =' уровень-2 '] // Ли [@ класс =' 1 уровня '] // DIV [@ класс ='уровень-3 '] // уль [@ класс =' уровень-3 '] // Li // а [@ класс =' уровень-3 '] [содержит (текст (),' носки)] "}

Я использую кропат из инструментов разработчика Chrome для получения xPath.

Я новичок в автоматизации, я действительно надеюсь, что кто-то может посоветовать.Спасибо.

@ SameerArora Это код, который я должен очистить во всплывающем окне, как я уже упоминал в комментариях ниже.

//for clearing the popup window
    @FindBy(how=How.XPATH,using="//*[starts-with(@id,'popup-subcription-closes-link-')]")
    public WebElement newsletterpopup;  

    public String clickCategory(){
                //.....
                resusableFunctions.buttonClick(driver, newsletterpopup, "popoup");
                }
    public void buttonClick(WebDriver driver, WebElement element, String elementName) throws InterruptedException
        {
            try
            {
                element.click();
                System.out.println("Log: ResuableFunction.buttonClick");
            }
        catch (org.openqa.selenium.ElementNotInteractableException notInteract)
            {}

Ответы [ 4 ]

1 голос
/ 11 марта 2019

Элемент, который вы ищете, можно найти с помощью xpath:

WebElement element = driver.findElement(By.xpath("(//a[contains(text(),'Socks')])[1]"));

Однако, поскольку элемент не виден напрямую при открытии ссылки, вы получите NoSuchElementException, поэтому для его разрешенияВы можете использовать javascript click метод для элемента, который непосредственно работает с div страницы.
В дополнение к этому я вижу, что при первом открытии страницы появляется всплывающее окно подписки, поэтому вам нужно отменитьсначала это всплывающее окно (если оно есть), а затем нажмите на элемент «Socks», используя метод щелчка JavaScript.

Ваш код должен выглядеть следующим образом:

List<WebElement> closeSubscriptionPopUp = driver.findElements(By.xpath("//a[contains(@id,'popup-subcription-closes-link')]"));
if (closeSubscriptionPopUp.size() > 0) {
    closeSubscriptionPopUp.get(0).click();
}
WebElement sockElement = driver.findElement(By.xpath("(//a[contains(text(),'Socks')])[1]"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", sockElement);
0 голосов
/ 14 марта 2019

Чтобы парить над «МУЖЧИНАМИ» >> аксессуары >> Раздел «Носки», Вам необходимо использовать селен Действия класс.

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

Процесс должен быть:

  1. перейти к элементу men first
  2. Перейти к аксессуарам
  3. затем перейдите к Носкам и нажмите на него.

Примечание: Используя класс Action, мы можем зацепить весь процесс за один раз. Как указано ниже

1) Первый способ:

Actions action = new Actions(driver);
action.moveToElement(driver.findElement(By.xpath("(//a[contains(text(),'MEN')])[2]")))
.moveToElement(driver.findElement(By.xpath("(//a[contains(text(),'Socks')])[1]")))
.click().build().perform();

2) Второй способ с ожиданием:

WebDriverWait wait= new WebDriverWait(driver, 10);
Actions action = new Actions(driver);
action.moveToElement(driver.findElement(By.xpath("(//a[contains(text(),'MEN')])[2]"))).build().perform();
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("(//a[contains(text(),'Socks')])[1]")));
action.moveToElement(driver.findElement(By.xpath("(//a[contains(text(),'Socks')])[1]")));
action.click().build().perform();
0 голосов
/ 11 марта 2019

Попробуйте:

//li[contains(@class,'menu_men')]//a[contains(text(),'Socks')]
0 голосов
/ 11 марта 2019

Попробуйте это // a [normalize-space (text ()) = 'Socks']

Я бы порекомендовал вам не использовать такие длинные xpath и пытаться написать xpath самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...