首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用python选择含硒的复合元素

无法使用python选择含硒的复合元素
EN

Stack Overflow用户
提问于 2017-01-12 23:56:33
回答 2查看 300关注 0票数 2

使用硒和铬驱动器。Python 3.5

想象一个开始时间和结束时间框。单击“开始时间”框,就会出现一个时钟。开始时钟是左对齐的,结束时钟是对齐的。

代码语言:javascript
复制
<div class="popover clockpicker-popover top clockpicker-align-left" style="display: block; top: 511px; left: 287px;">

代码语言:javascript
复制
<div class="clockpicker-dial clockpicker-hours" style="visibility: visible;"></div>

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

然后单击结束时间框:

代码语言:javascript
复制
<div class="popover clockpicker-popover top clockpicker-align-right" style="display: block; top: 511px; left: 287px;">

同样的时间和时间。

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

代码语言:javascript
复制
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选择器”,"selector":"popover.clockpicker-popover.top.clockpicker-align-left"}

当我删除那个driver.find_element_by_css_selector('popover.clockpicker-popover.top.clockpicker-align-left')时,它对第一个时钟很好,我可以通过单击它的输入框打开第二个时钟,但是我实际上不能选择第二个时钟或它的元素。

更新:

它似乎找到了时间,但它打印出一堆空行,这使我认为它仍然在第一个时钟,这是隐藏时,第二个时钟出现。

当我将我的print语句从print(hour.text)更改为print(hour)时,它显示如下:

24小时内24人。

答案:

我在popover.clockpicker...前面添加了句点,并且还通过css选择器追加了下一个find元素,它工作了!谢谢大家的帮助。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-13 08:59:47

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

代码语言:javascript
复制
'popover.clockpicker-popover.top.clockpicker-align-left'

实际上意味着你想处理

代码语言:javascript
复制
 <popover class="clockpicker-popover top clockpicker-align-left">

元素,因此需要将前导点作为

代码语言:javascript
复制
'.popover.clockpicker-popover.top.clockpicker-align-left'
票数 1
EN

Stack Overflow用户

发布于 2017-01-13 00:07:32

因此,它听起来像是在弹出第一个时钟(对齐-左),但是您的错误表明是这个元素失败了。这似乎不对..。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41625167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档