繁体   English   中英

需要一个动态的 python selenium 通过 xpath 选择一个元素的方式

[英]Need a dynamic python selenium way of picking an element by xpath

这是它需要从中选择的 HTML:

<tbody class="datepickerDays">
    <tr>
        <th class="datepickerWeek"><a href="#"><span>40</span></a></th>
        <td class="datepickerNotInMonth"><a href="#"><span>28</span></a></td>
        <td class="datepickerNotInMonth"><a href="#"><span>29</span></a></td>
        <td class="datepickerNotInMonth"><a href="#"><span>30</span></a></td>
        <td class=""><a href="#"><span>1</span></a></td>
        <td class=""><a href="#"><span>2</span></a></td>
        <td class="datepickerSaturday"><a href="#"><span>3</span></a></td>
        <td class="datepickerSunday"><a href="#"><span>4</span></a></td>
    </tr>
    <tr>
        <th class="datepickerWeek"><a href="#"><span>41</span></a></th>
        <td class=""><a href="#"><span>5</span></a></td>
        <td class=""><a href="#"><span>6</span></a></td>
        <td class=""><a href="#"><span>7</span></a></td>
        <td class="datepickerSelected"><a href="#"><span>8</span></a></td>
        <td class=""><a href="#"><span>9</span></a></td>
        <td class="datepickerSaturday"><a href="#"><span>10</span></a></td>
        <td class="datepickerSunday"><a href="#"><span>11</span></a></td>
    </tr>
    <tr>
        <th class="datepickerWeek"><a href="#"><span>42</span></a></th>
        <td class=""><a href="#"><span>12</span></a></td>
        <td class=""><a href="#"><span>13</span></a></td>
        <td class=""><a href="#"><span>14</span></a></td>
        <td class=""><a href="#"><span>15</span></a></td>
        <td class=""><a href="#"><span>16</span></a></td>
        <td class="datepickerSaturday"><a href="#"><span>17</span></a></td>
        <td class="datepickerSunday"><a href="#"><span>18</span></a></td>
    </tr>
    <tr>
        <th class="datepickerWeek"><a href="#"><span>43</span></a></th>
        <td class=""><a href="#"><span>19</span></a></td>
        <td class=""><a href="#"><span>20</span></a></td>
        <td class=""><a href="#"><span>21</span></a></td>
        <td class=""><a href="#"><span>22</span></a></td>
        <td class=""><a href="#"><span>23</span></a></td>
        <td class="datepickerSaturday"><a href="#"><span>24</span></a></td>
        <td class="datepickerSunday"><a href="#"><span>25</span></a></td>
    </tr>
    <tr>
        <th class="datepickerWeek"><a href="#"><span>44</span></a></th>
        <td class=""><a href="#"><span>26</span></a></td>
        <td class=""><a href="#"><span>27</span></a></td>
        <td class=""><a href="#"><span>28</span></a></td>
        <td class=""><a href="#"><span>29</span></a></td>
        <td class=""><a href="#"><span>30</span></a></td>
        <td class="datepickerSaturday"><a href="#"><span>31</span></a></td>
        <td class="datepickerNotInMonth datepickerSunday"><a href="#"><span>1</span></a></td>
    </tr>
    <tr>
        <th class="datepickerWeek"><a href="#"><span>45</span></a></th>
        <td class="datepickerNotInMonth"><a href="#"><span>2</span></a></td>
        <td class="datepickerNotInMonth"><a href="#"><span>3</span></a></td>
        <td class="datepickerNotInMonth"><a href="#"><span>4</span></a></td>
        <td class="datepickerNotInMonth"><a href="#"><span>5</span></a></td>
        <td class="datepickerNotInMonth"><a href="#"><span>6</span></a></td>
        <td class="datepickerNotInMonth datepickerSaturday"><a href="#"><span>7</span></a></td>
        <td class="datepickerNotInMonth datepickerSunday"><a href="#"><span>8</span></a></td>
    </tr>
</tbody>

该代码应确定今天是什么日期并单击该日期。 我认为不需要月/年,因为程序将看到的唯一视图是当前月份。 如果您的解决方案也可以提供月份选择器,那就太好了。

所以我们需要当前日期(例如:8 号,而前一个日期是 5 号)、当前日期名称,程序需要根据它来选择。

目前的努力:

driver.find_element_by_xpath('//td[@class="datepickerSelected"]/a[text()="8"]').click()

但是 Selenium 没有点击它。

我无法向您展示完整的代码,或者我们正在使用它的网站,因为它在登录环境中。

使用以下xpath查找元素。

driver.find_element_by_xpath('//td[@class="datepickerSelected"]/a[./span[text()="8"]]').click() 

要获取今天的日期,您可以使用datetime 有关详细信息,请参阅文档 拥有它后,您可以将日期插入定位器并单击该元素。

与您发布的 HTML 相比,您的定位器存在一些问题。

//td[@class="datepickerSelected"]/a[text()="8"]
  1. 这是在寻找具有 class“datepickerSelected”但它不存在于您发布的 HTML 中的 TD。 我假设 class 仅在您选择日期后出现,但当您首次进入页面时,情况并非如此,因此我们无法使用 class 来定位我们想要的日期。

  2. text()方法在指定元素内查找文本,在本例中为 A 标签。 如果您查看 HTML,文本实际上位于 A 标签的 SPAN 子标签内。 有几种方法可以解决这个问题。 您可以将定位器的那部分更改为/a/span[text()="8"]或使用. 它“扁平化”了所有子元素的文本,例如/a[.="8"] 无论哪种方式都会起作用。

您必须处理的另一个问题是,如果这一天晚于或早于该月,那么它会在 HTML 中出现两次,例如 2 或 28。要获得正确的日期,您需要在 SPAN 中指定日期TD 为空 class。错误的 TD 为 class datepickerNotInMonth

考虑到所有这些,这是我将使用的代码。

import datetime

today = datetime.datetime.now().day
driver.find_element_by_xpath(f'//td[@class=""]/a[.="{today}"]').click()

定位器找到一个 TD,其中包含一个空的 class,它的子 A 包含对应于今天的(扁平化的)文本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM