Как определить элемент, идентификатор которого динамически меняется и не имеет других атрибутов в селене?

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

<span role="listbox" unselectable="on" class="k-dropdown-wrap k-state-default" id="dde13a91-2bf3-4e41-af72-bee1b881a8d9" dir="ltr" readonly="false" tabindex="0" aria-disabled="false" aria-readonly="false" aria-haspopup="true" aria-expanded="false" aria-owns="48f666d8-4c3c-43a8-a4dc-8e7a9961a0ef" aria-activedescendant="ca3c4431-3ebf-46c0-9510-a64a32eae108-C.US.0000110896">
            <span unselectable="on" class="k-input">
               <!---->
               <!---->2018 ALBERTSONS / Beverage Mixes
           </span>
           <span unselectable="on" class="k-select">
               <span class="k-i-arrow-s k-icon"></span>
           </span>
           <!---->
        </span>

person chinmay raskar    schedule 04.10.2018    source источник
comment
Вы можете использовать List для хранения всех элементов в списке с помощью XPath   -  person Dhru 'soni    schedule 04.10.2018
comment
@chinmayraskar Какой Selenium Language Binding Art вы используете? Java / Python / C# / NodeJS ?   -  person DebanjanB    schedule 04.10.2018
comment
Если вы можете объяснить на английском языке, как вы будете смотреть на HTML-страницу и определять элемент, который хотите извлечь, мы можем помочь вам перевести это английское описание в XPath. Если вы не можете сказать нам, какие критерии вы используете для распознавания правильного элемента, то мы не сможем вам помочь.   -  person Michael Kay    schedule 04.10.2018


Ответы (3)


Если в раскрывающемся списке всегда присутствует значение, вы можете попытаться найти это значение по тексту или что-то в этом роде, а затем получить родителя: XPath: получить родительский узел из дочернего узла

Другой способ - получить его по xpath структуры, например: div[3]/.../span и т. д. Это нехорошо, так как каждое изменение может провалить ваш тест, но если у вас нет других вариантов, вы можете захотеть попробуй это.

person Deryl    schedule 04.10.2018
comment
Спасибо за ваше решение, но значения в раскрывающемся списке скрыты и видны только тогда, когда пользователь выбирает определенное значение во время выполнения. Таким образом, нет возможности отследить его от дочернего узла или любой относительной ссылки. - person chinmay raskar; 05.10.2018

Чтобы щелкнуть элемент с единственным атрибутом-текстом, как 2018 ALBERTSONS / Beverage Mixes, вам нужно вызвать WebDriverWait, чтобы элемент стал кликабельным и вы можете использовать следующее решение:

  • (Ява) xpath:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//span[@class='k-dropdown-wrap k-state-default' and @role='listbox']//span[@class='k-input']"))).click();
    
person DebanjanB    schedule 04.10.2018
comment
Пробовал, но элемент не нажимается. - person chinmay raskar; 05.10.2018
comment
Элемент ‹span unselectable=on class=k-input›...‹/span› не активен в точке (45, 92). Другой элемент получит клик: ‹div _ngcontent-c4= style=margin-bottom:5px;›...‹/div› - person chinmay raskar; 05.10.2018

Я нашел обходной путь, чтобы найти элемент:

Сначала получите xpath тега span внутри раскрывающегося списка, используя его текст, как показано ниже: //text()[contains(.,'2018')] поскольку '2018' является общим независимо от соседнего текста

Затем перейдите к родительскому тегу раскрывающегося списка, чтобы найти рамку раскрывающегося списка, которую можно свернуть по щелчку: //text()[contains(.,'2018 ')]/parent::/parent::

затем просто нажмите на элемент, который находится. driver.findElement(By.xpath("//text()[содержит(.,'2018')]/parent::/parent::")).click();

person chinmay raskar    schedule 08.10.2018