【问题标题】:Can't select compound element with selenium using python无法使用python选择带有硒的复合元素
【发布时间】:2017-01-12 23:56:33
【问题描述】:

使用 selenium 和 chrome 驱动程序。 Python 3.5

想象一个开始时间和结束时间框。单击开始时间框,会出现一个时钟。开始时钟左对齐,结束时钟右对齐。

<div class="popover clockpicker-popover top clockpicker-align-left" style="display: block; top: 511px; left: 287px;">

<div class="clockpicker-dial clockpicker-hours" style="visibility: visible;"></div>

<div class="clockpicker-dial clockpicker-minutes" style="visibility: visible;"></div>

然后点击结束时间框:

<div class="popover clockpicker-popover top clockpicker-align-right" style="display: block; top: 511px; left: 287px;">

相同的小时和分钟。

我的问题是选择时钟的左右版本。事实上,我的代码运行良好,直到我不得不输入结束时间,所以我决定添加代码来区分它们。

import time, sys
from selenium import webdriver

# open chrome and go to website
driver = webdriver.Chrome()
driver.get('website')
time.sleep(3)


def startHour(number):
    # If I remove this line I can select hours/mins for first clock but not second clock
    driver.find_element_by_css_selector('popover.clockpicker-popover.top.clockpicker-align-left')
    select = driver.find_element_by_css_selector('.clockpicker-dial.clockpicker-hours')
    print('Selected clockpicker hours')
    for hour in select.find_elements_by_class_name('clockpicker-tick'):
        print(hour.text)
        if hour.text == number:
            print('Hour.text: ' + hour.text)
            print('Hour: ' + number)
            hour.click()
            break

def endHour(number):
    driver.find_element_by_css_selector('popover.clockpicker-popover.top.clockpicker-align-right')
    select = driver.find_element_by_css_selector('.clockpicker-dial.clockpicker-hours')
    print('Selected clockpicker hours')
    for hour in select.find_elements_by_class_name('clockpicker-tick'):
        print(hour.text)
        if hour.text == number:
            print('Hour.text: ' + hour.text)
            print('Hour: ' + number)
            hour.click()
            break

def clickMinutes(number):
    select = driver.find_element_by_css_selector('.clockpicker-dial.clockpicker-minutes')
    print('Selected clockpicker minutes')
    for minutes in select.find_elements_by_class_name('clockpicker-tick'):
        print(minutes.text)
        if minutes.text == number:
            print('Minutes.text: ' + minutes.text)
            print('Minutes: ' + number)
            minutes.click()
            break

# Select start time input box, start time clock appears
driver.find_element_by_id('StartTime').click()

startHour('7')
time.sleep(4)

clickMinutes('30')
time.sleep(4)

# Select end time input box, end time clock appears
driver.find_element_by_id('EndTime').click()
time.sleep(4)

endHour('16')
time.sleep(4)

clickMinutes('00')
time.sleep(4)

driver.quit()
sys.exit()

错误:

selenium.common.exceptions.NoSuchElementException:消息:没有这样的 元素:无法找到元素:{“方法”:“css 选择器","选择器":"popover.clockpicker-popover.top.clockpicker-align-left"}

当我删除 driver.find_element_by_css_selector('popover.clockpicker-popover.top.clockpicker-align-left') 时,它适用于第一个时钟,我可以通过单击输入框打开第二个时钟,但实际上我无法选择第二个时钟或其元素。

更新:

它似乎找到了小时,但它打印出一堆空行,这让我觉得它仍然在第一个时钟上,当第二个时钟出现时它被隐藏了。

当我将打印语句从 print(hour.text) 更改为 print(hour) 时,它会显示:

24 小时内的 24 个元素。

回答:

我在popover.clockpicker... 前面添加了句点,还通过css 选择器附加了下一个查找元素,它起作用了!谢谢大家的帮助。

def startHour(number):
    select = driver.find_element_by_css_selector('.popover.clockpicker-popover.top.clockpicker-align-left').find_element_by_css_selector('.clockpicker-dial.clockpicker-hours')
    print('Selected clockpicker hours')
    for hour in select.find_elements_by_class_name('clockpicker-tick'):
        print(hour.text)
        if hour.text == number:
            print('Hour.text: ' + hour.text)
            print('Hour: ' + number)
            hour.click()
            break

def endHour(number):
    select = driver.find_element_by_css_selector('.popover.clockpicker-popover.top.clockpicker-align-right').find_element_by_css_selector('.clockpicker-dial.clockpicker-hours')
    print('Selected clockpicker hours')
    for hour in select.find_elements_by_class_name('clockpicker-tick'):
        print(hour.text)
        if hour.text == number:
            print('Hour.text: ' + hour.text)
            print('Hour: ' + number)
            hour.click()
            break

【问题讨论】:

    标签: python selenium selenium-webdriver selenium-chromedriver


    【解决方案1】:

    我猜你的问题是由选择器中的拼写错误引起的:

    'popover.clockpicker-popover.top.clockpicker-align-left'
    

    其实就是你要处理的意思

     <popover class="clockpicker-popover top clockpicker-align-left">
    

    元素,所以需要添加前导点为

    '.popover.clockpicker-popover.top.clockpicker-align-left'
    

    【讨论】:

      【解决方案2】:

      所以,听起来它正在弹出第一个时钟(左对齐),但您的错误表明它是这个元素失败了。好像不对……

      另外,你提到你必须在第二个时钟出现之前实际点击第一个时钟,我看不出你在哪里这样做。

      【讨论】:

      • 我用更多代码更新了我的问题。所以我点击元素 id StartTime 的输入框,时钟出现了。如果我去掉 popover.clockpicker-popover.top.clockpicker-align-left 选择器,我的代码适用于第一个时钟,但当我移至第二个时钟时它不起作用。
      • 我猜这是因为第二个时钟出现了,但我还没有真正选择它,它仍在读取第一个时钟的小时/分钟,现在隐藏了,因为它消失了时钟出现。
      • 啊,我以为两个时钟仍然可见。在这种情况下,我会说从第一个时钟获取值,单击它,从第二个获取 vals ......但我相信你已经弄清楚了。 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多