以X开头并以零或最小数字结尾的Python XPath

时间:2018-10-11 17:28:14

标签: python xpath

如果有人可以帮助我编写实现以下目标的XPath,我将不胜感激:

  • 查找具有以下ID的元素:'revit_form_Button_50',其中数字不断变化(可以是30/40,但页面上的第一个似乎总是以0结尾),并且标题为“每日技术总计/每日技术总计/员工每日总计报告”
  • OR查找和类似这样的元素:'revit_form_Button _'+'mininumnumber'并显示以下图块:“每日技术总计/每日技术总计/员工每日总计报告”

任何方法都会极大地帮助我。

我的前两次失败尝试:

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()

enter image description here

<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 :(得分:2)

XPath 1.0中没有ends-with,但是您可以使用

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

满足附加条件

  

,并且标题为“每日技术总计/每日技术总计/员工每日总计报告”

添加类似的子句

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表达式。为了便于阅读,分为几行,但也可以是一行。