Python XPath, который начинается с X и заканчивается на ноль или наименьшее число

1

Я был бы очень благодарен, если бы кто-то мог дать мне руку с написанием XPath, который достигает следующего:

  • Находит элемент со следующим id: 'revit_form_Button_50', где число постоянно изменяется (может быть 30/40, но похоже, что первый на странице всегда заканчивается на 0), а также имеет название "Daily Tech Totals/Daily Tech Totals"/Отчет о ежедневных итогах сотрудников "
  • OR Finds и элемент вроде этого: 'revit_form_Button _' + 'mininumnumber' и имеет плитку: "Daily Tech Totals/Daily Tech Totals/Employee Daily Totals Report"

Любой подход очень помог бы мне.

Мои первые две неудачные попытки:

browser.find_element_by_xpath("//*[starts-with(@id,'revit_form_Button_' ) and ends-with(@id,'0')]").click()

browser.find_element_by_xpath("//*[boolean(number(substring-before(substring-after(@id, 'revit_form_Button_'), '0')))]").click()

Изображение 174551

<div id="reporting_grid_CellReportTitle_10" class="rptCellReportTitle" widgetid="reporting_grid_CellReportTitle_10">
    <div dojoattachpoint="divReportTitle" class="rptCellReportTitleSpanNode"><span class="dijit dijitInline dijitReset revitButtonHideBackground revitButton" data-dojo-attach-point="focusNode,titleNode,stateNode" role="button" aria-labelledby="revit_form_Button_30_label" data-dojo-attach-event="ondijitclick:_onClick" tabindex="0" id="revit_form_Button_30" widgetid="revit_form_Button_30" style="position: relative; user-select: none;">
    <span class="dijitReset revitIconNode dijitNoIcon" data-dojo-attach-point="iconNode" style="display: none;"></span>
    <span class="dijitReset dijitButtonText" id="revit_form_Button_30_label" data-dojo-attach-point="containerNode" style="padding-left: 0px; text-transform: none;"><b>Daily Tech Totals / Daily Tech Totals / Employee Daily Totals Report</b></span>
    <span class="dijitReset revitIconNode revitIconRightNode dijitNoIcon" data-dojo-attach-point="iconRightNode"></span>
    <input type="button" value="" class="dijitOffScreen" tabindex="-1" role="presentation" data-dojo-attach-point="valueNode">
</span></div>
    <div dojoattachpoint="divNotes" class="rptCellReportTitleNotesNode"></div>
    <div dojoattachpoint="divSchedule" class="rptCellReportTitleScheduleNode"></div>
</div>

<div id="reporting_grid_CellReportTitle_11" class="rptCellReportTitle" widgetid="reporting_grid_CellReportTitle_11">
    <div dojoattachpoint="divReportTitle" class="rptCellReportTitleSpanNode"><span class="dijit dijitInline dijitReset revitButton revitButtonHideBackground" data-dojo-attach-point="focusNode,titleNode,stateNode" role="button" aria-labelledby="revit_form_Button_31_label" data-dojo-attach-event="ondijitclick:_onClick" tabindex="0" id="revit_form_Button_31" widgetid="revit_form_Button_31" style="position: relative; user-select: none;">
    <span class="dijitReset revitIconNode dijitNoIcon" data-dojo-attach-point="iconNode" style="display: none;"></span>
    <span class="dijitReset dijitButtonText" id="revit_form_Button_31_label" data-dojo-attach-point="containerNode" style="padding-left: 0px; text-transform: none;"><b>Daily Tech Totals / Daily Tech Totals / Employee Daily Totals Report</b></span>
    <span class="dijitReset revitIconNode revitIconRightNode dijitNoIcon" data-dojo-attach-point="iconRightNode"></span>
    <input type="button" value="" class="dijitOffScreen" tabindex="-1" role="presentation" data-dojo-attach-point="valueNode">
</span></div>
    <div dojoattachpoint="divNotes" class="rptCellReportTitleNotesNode"></div>
    <div dojoattachpoint="divSchedule" class="rptCellReportTitleScheduleNode"></div>
</div>
  • 1
    Второй должен работать. Можете ли вы поделиться исключением?
  • 0
    Второй XPath также найдет revit_form_Button_401
Показать ещё 7 комментариев
Теги:
xpath

1 ответ

2
Лучший ответ

В XPath 1.0 нет ends-with, но вы можете использовать

"//*[starts-with(@id,'revit_form_Button_' ) and substring(@id,string-length(@id)) = '0']"

Для удовлетворения дополнительного условия

а также имеет название "Daily Tech Totals/Daily Tech Totals/Employee Daily Totals Report"

добавить предложение типа

child::*[text() = 'full content of the child element here']

или же

child::*[contains(text(),'text to match here')]

к вашему XPath. В вашем примере дочерний элемент был <b>. Таким образом, вы также можете записать child::b вместо child::*.

Объединяя все это:

"//*[starts-with(@id,'revit_form_Button_')
    and substring(@id,string-length(@id)) = '0'
    and child::*[text() = 'Daily Tech Totals / Daily Tech Totals / Employee Daily Totals Report']
]"

Это одно единственное выражение XPath. Сломанный в несколько строк для удобочитаемости, но может быть одной строкой.

  • 0
    Я пробовал только первую часть без дополнительного условия и получаю следующее: selenium.common.exceptions.ElementNotVisibleException: Message: element not interactable . Если я использую полный не действителен. SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//*[starts-with(@id,'revit_form_Button_') and substring(@id,string-length(@id)) = '0' and child::*[text() = 'Daily Tech Totals / Daily Tech Totals / Employee Daily Totals Report']' is not a valid XPath expression. Спасибо за ваше время и помощь!
  • 1
    element not interactable выглядит так, как будто вы не можете click() чтобы <span> . Это должно быть связано с селеном, а не с XPath. По второму вопросу вы пропускаете закрытие ] . В этом выражении есть два вложенных предиката, которые должны быть закрыты. Смотрите конец третьей строки и последнюю строку моего примера.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню