Проверьте, развернуто ли дерево или открыто (Selenium / Python) - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь выяснить, как 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"

Закрыть дерево: Дерево закрыто

1 Ответ

0 голосов
/ 23 ноября 2018

Хорошо, я думаю, у нас это есть.

Я использовал красивый суп - https://pypi.org/project/beautifulsoup4/ - который мы используем для просмотра классов HTML.

Как только селен загрузит страницу, возьмите 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>]

Надеюсь, что этопомогает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...