Selenium - Python - Нажмите дочерний элемент на основе имени класса родителей - PullRequest
0 голосов
/ 10 июля 2019

Я перемещаюсь по веб-странице, используя селен, и нажимаю различные кнопки для выполнения различных задач. Каждая кнопка, которую я нажал до сих пор, имеет своего рода уникальный идентификатор, который позволяет мне точно найти и щелкнуть этот элемент. Тем не менее, есть кнопка, которая разделяет все идентификаторы с другими кнопками на той же странице (т.е. нет способа идентифицировать ее напрямую). Эта кнопка является потомком (7 поколений ниже) элемента с уникальным идентификатором класса.

Кнопки страницы являются динамическими, поэтому многие элементы меняют атрибуты при каждой загрузке страницы.

Я пробовал каждую комбинацию под радугой нажимать эту кнопку, но не нашел решения.

Вот некоторые сценарии, которые я пробовал: 1.

ele = browser.find_element_by_xpath("//*[@class='firsttile']//*[@class='md-icon-button md-accent md-button md-ink-ripple md-default-theme']")
ele.click()

2

ele = browser.find_element_by_xpath("//*[@class='firsttile']/*/[@class='md-icon-button md-accent md-button md-ink-ripple md-default-theme']")
ele.click()

3

ele = browser.find_element_by_xpath("//*[@class='firsttile']*/*[@class='md-icon-button md-accent md-button md-ink-ripple md-default-theme']")
ele.click()

4

ele = browser.find_element_by_xpath("//*[@class='firsttile']///////[@class='md-icon-button md-accent md-button md-ink-ripple md-default-theme']")
ele.click()

Это кнопка:

<button class="md-icon-button md-accent md-button md-ink-ripple md-default-theme" type="button" ng-transclude="" ng-click="$mdOpenMenu($event)" aria-haspopup="true" aria-expanded="false" aria-owns="menu_container_338">

Это родитель с уникальным идентификатором как firsttile

<measure-tile measure-info="measure" ng-class="measure.lookup + 'Tile'" class="firsttile">

Любая помощь или понимание будут с благодарностью! Ничто в стеке или другие сайты не помогли мне решить эту проблему. Заранее спасибо.

Edit: Я приложил полный путь DOM здесь. Первоначально я опубликовал, что имя класса было «firsttile», но в своем сообщении его не идентифицировали. Истинное имя класса - «ontimestartsTile». enter image description here

Я приложил мою последнюю попытку здесь:

parent = browser.find_element_by_class_name('firsttile');
    button = parent.find_element_by_xpath("//*[@class='md-icon-button md-accent md-button md-ink-ripple md-default-theme']")
    button.click()

Ответы [ 5 ]

0 голосов
/ 11 июля 2019

Лучшее решение - использовать метод "find_element_by_css_selector ()". Это самый надежный метод. Решение в одну строку:

browser.find_element_by_css_selector('.ontimestartsTile button[ngclick="$mdOpenMenu($event)"]').click()

0 голосов
/ 11 июля 2019

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

//measure-tile[@class='firsttile']/descendant::button

Дополнительная информация:

0 голосов
/ 10 июля 2019

Я не знаком с Python, но он будет почти таким же, как и другие языки.Надеюсь, что это поможет, вот код C # для справки

  1. Если ваша кнопка имеет уникальный класс из поддерева, начиная с вашего родительского узла, используйте ниже кодовую ссылку

    IWebElement parent= driver.FindElement(By.XPath("first time"));
    var myButton= parent.FindElements(By.XPath("//div[@class='md-icon-button md-accent md-button md-ink-ripple md-default-theme']"));

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

List<IWebElement> Managers = parent.FindElements(By.XPath("//div[@class='md-icon-button md-accent md-button md-ink-ripple md-default-theme']")).ToList();

если в списке более 1 элемента, вам следует использовать абсолютный XPath.

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

Я надеюсь, что эта тренировка для вас.если вы можете поделиться ссылкой или просмотреть снимок элемента с изображением Full DOM, я могу помочь вам еще лучше.Спасибо: -)

0 голосов
/ 11 июля 2019

Мне удалось выяснить это с соответствующим синтаксисом. Сначала я должен был определить родительский объект как переменную, затем использовал эту переменную при определении дочерней кнопки. Вот мое решение:

element = browser.find_element_by_class_name('ontimestartsTile')
element.find_element_by_xpath('.//button[@class="md-icon-button md-accent md-button md-ink-ripple md-default-theme"]').click()
0 голосов
/ 10 июля 2019

XPathing, который вы используете, довольно специфичен.Я хотел бы попробовать что-то вроде:

//*[@class="firsttile"]/div/div/span/div/whatever/[contains(@class,"md-icon-button")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...