首页 > 解决方案 > 检查树是否展开或打开(Selenium / Python)

问题描述

我想弄清楚 Selenium 如何检查树是否打开/扩展以及是否成功。

例如,我们有这些代码行,这是父级(使用元素面板的 DOM 视图)。这是开着的树: 树开着

通过使用控制台选项卡,我看到了这一点,我认为这可能很有用......但我真的不知道如何使用 [ opened: true]获取状态

li_attr: {id: "j1_1"}
original: {was_excel_sheet: false, item_name: "Profit and Loss", text: "01 
Profit and Loss", mapped: false, initial_order: "01", …}
parent: "#"
parents: ["#"]
state: {loaded: true, opened: true, selected: true, disabled: false}
text: "01 Profit and Loss"
type: "root"

关闭树: 树关闭

标签: javascriptpythonseleniumautomationtree

解决方案


好吧,我想我们明白了。

我用过漂亮的汤 - https://pypi.org/project/beautifulsoup4/ - 我们用它来浏览 html 的类。

一旦 selenium 加载了页面,抓取 html 并使用漂亮的汤将它变成我们可以使用的东西 - 下面是一个如何做到这一点的小例子

from bs4 import BeautifulSoup

html = driver.page_source
soup = BeautifulSoup(html, 'lxml')

鉴于我没有 html,我制作了一些与您上传的图像匹配的小版本,下面是“jstree-open”类已知的开放行项目。

open = '''
    <div id="tree" class="jstree jstree-1">
        <ul class="jstree-container-ul jstree-children">
            <li class="jstree-node jstree-last jstree-open">
            </li>
        </ul>
    </div>
    '''

open_soup = BeautifulSoup(open)

使用 css 选择器,我们可以获得 li 的所有类名:

classes_of_open_li = open_soup.select('div#tree ul.jstree-container-ul li')[0].get('class')
print(classes_of_open_li)

out: ['jstree-node', 'jstree-last', 'jstree-open']

然后我们可以测试看看 'jstree-open' 是否是这些类之一:

'jstree-open' in classes_of_open_li

out: True

然后我们可以测试相反的情况:

closed = '''
    <div id="tree" class="jstree jstree-1">
        <ul class="jstree-container-ul jstree-children">
            <li class="jstree-node jstree-last jstree-closed">
            </li>
        </ul>
    </div>
    '''
closed_soup = BeautifulSoup(closed)
classes_of_closed_li = closed_soup.select('div#tree ul.jstree-container-ul li')[0].get('class')
'jstree-open' in classes_of_closed_li

out: False

之后,您想选择所有列表项,您可以使用相同的函数返回所有列表项的列表:

li = '''
    <div id="tree" class="jstree jstree-1">
        <ul class="jstree-container-ul jstree-children">
            <li class="jstree-node jstree-last jstree-closed">
                <ul>
                    <li></li>
                    <li></li>
                    <li></li>
                    <li></li>
                </ul>
            </li>
        </ul>
    </div>
    '''
line_soup = BeautifulSoup(li)
all_line_items = line_soup.select('div#tree ul.jstree-container-ul li ul li')

out: [<li></li>, <li></li>, <li></li>, <li></li>]

希望这可以帮助!


推荐阅读