【问题标题】:Selenium python - How to scroll to text that its parent element contains class="min"Selenium python - 如何滚动到其父元素包含的文本 class="min"
【发布时间】:2018-10-14 20:09:50
【问题描述】:

如何滚动到只包含 min 类的文本

<div>
   <div class="item filter_2 firstPart">
       <div class="date">16/10/2018</div>
       <div class="time">04:00</div>
       <div class="event">Ningbo, China</div>
       <div class="subevent">HE, Yecong - Kecmanovic, Miomir</div>
       <div class="odds">
          <div class="odd" idq="2998675069">
             <div class="tq">1HH</div>
             <div class="value">8.00</div>
          </div>
          <div class="odd min" idq="2998675068">
             <div class="tq">2HH</div>
             <div class="value">1.03</div>
          </div>
      </div>
   </div>
</div>

如果存在 min 类,我想滚动到文本

这是我尝试过的:

new_text = ['2.10', '2.15', '2.20', '2.25', '2.30', '2.35', '2.40', 
                 '2.45', '2.50', '2.55', '2.60', '2.65', '2.70',
                 '2.75', '2.80', '2.85', '2.90', '2.95', '3.10']

for text in new_text:
    if text in driver.page_source:
       parent = driver.find_element_by_css_selector(".odd.min")
       child = parent.find_element_by_xpath("//div[@class='value' 
               and text()='" + text + "']")
       if child:
               print(text)
               element = child
               driver.execute_script('arguments[0].scrollIntoView();', 
                 element)
               driver.save_screenshot('lo7.png')
               break
       else:
               print("No odd found")
               continue

这段代码的问题在于它还会滚动到不包含 min 类的文本

图像文件:

【问题讨论】:

  • 到目前为止你尝试过什么?您能否在问题中添加一些代码?
  • 请参阅:How do I do X? SO 的期望是,提出问题的用户不仅会进行研究以回答他们自己的问题,还会分享研究、代码尝试和结果。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案!另见:How to Ask
  • 为什么需要滚动到该文本?
  • @JeffC,我需要确认文本存在页面并且它是最小类
  • @jamesmaduka min 类是否总是与odd 类一起出现?还是和even 一起上课?如果是这样,您会考虑滚动到类min 的第一个元素吗?

标签: python selenium


【解决方案1】:
//div[@class='odd min']/div[@class='tq']/text()

你可以试试这个xpath表达式来得到“2HH”的值。

【讨论】:

    【解决方案2】:

    问题在于您的 XPath 定位器。您正在定位parent,然后从那里开始使用XPath 搜索仅使用parent.find_element_by_xpath("//div... 的孩子。如果您希望 XPath 从 parent 上下文开始,则需要在开头添加 .,例如".//div[@class='value' and ..."。如果您不包含 .,那么您的 XPath 会查看整个页面,正如您所发现的那样。

    有一个更好的方法可以做到这一点...不要打印一堆屏幕截图,只需拉出您想要的几率并将它们与您想要的列表进行比较。

    values_from_page = driver.find_elements_by_css_selector(".odd.min > div.value") # all odds elements from the page
    odds = (e.text for e in values_from_page if e.is_displayed()) # filter down to only visible elements and get the text
    print(odds)
    
    new_text = ['2.10', '2.15', '2.20', '2.25', '2.30', '2.35', '2.40', 
                '2.45', '2.50', '2.55', '2.60', '2.65', '2.70',
                '2.75', '2.80', '2.85', '2.90', '2.95', '3.10']
    missing_odds = new_text.difference(odds) # filter down to any new_text odds missing on page
    print(missing_odds)
    

    这是未经测试的代码,但应该非常接近。使用我的代码,它应该运行得更快,因为您只抓取页面一次(而且只有一次),而不是在 new_text 中每个项目抓取两次,再加上滚动页面并为每个项目截取屏幕截图。

    当您截取屏幕截图时,必须有人查看它以进行验证。这需要手动工作和时间......尽可能避免这种情况。让自动化为您进行验证,仅在出现错误/缺失时报告。如果missing_odds 为空len(x) = 0,则找到new_text 中的所有项目。任何打印出来的东西都从页面上丢失了。

    希望这有助于您朝着正确的方向开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多