【问题标题】:Check if a tree is expanded or open (Selenium / Python)检查树是否展开或打开(Selenium / Python)
【发布时间】:2018-11-21 15:45:00
【问题描述】:

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

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

通过使用控制台选项卡,我看到了这一点,我认为这可能很有用......但我真的不知道如何通过 [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"

关闭树: Tree closed

【问题讨论】:

  • 你好陀螺仪。您能否提供与上面相同但打开和关闭的 html。这样我们就可以看到我们必须使用哪些额外的类。
  • 当然。看看编辑。必须上传图片,否则代码太多。

标签: javascript python selenium automation tree


【解决方案1】:

好的,我想我们知道了。

我用过漂亮的汤 - 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>]

希望这会有所帮助!

【讨论】:

  • 不幸的是它不起作用。得到一些奇怪的错误。将继续我的下一个任务,稍后再讨论该问题。
猜你喜欢
  • 1970-01-01
  • 2017-12-29
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 2017-05-26
相关资源
最近更新 更多