XPATH выражение для подсчета количества входных тегов в HTML-форме - PullRequest
0 голосов
/ 11 июля 2019

Я хочу подсчитать количество входных тегов, присутствующих в формах HTML.

Я использовал Selenium Web Driver (Chrome) с Python3.

Код Python

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def extract_login_details(url):
    options = Options()
    options.add_argument('--headless')
    browser = webdriver.Chrome(chrome_options=options)
    browser.get(url)

    forms = browser.find_elements_by_xpath('//form')
    print(f'forms - {len(forms)}')

    for i in range(len(forms)):
        inputs = browser.find_elements_by_xpath(f'//form[{i+1}]//*/input | //form[{i+1}]/input')
        print(f'input tags in form{i+1} is {len(inputs)}')



extract_login_details('http://localhost:8081/selenium/test2.jsp')

test2.jsp

<html>
<body>

    <form action="form1" method="post" autocomplete="on" >
        <input type="email" class="inputtext" name="email1" id="email1"/>
        <input type="password" class="inputtext" name="pass" id="pass"/>
        <input type="submit">
    </form>

    <form action="form2">
        <input type="email" class="inputtext" name="email2" id="email2"/>
        <div><input type="password" class="inputtext" name="pass2" id="pass2"/></div>
    </form>

</body>
</html>

Правильный вывод

формы - 2
входные теги в form1 это 3
входные теги в form2 это 2

Но когда я заключаю вторую форму внутри тега div ( модифицированный test2.jsp ), я получаю неправильныйвывод.

<html>
<body>

        <form action="form1" method="post" autocomplete="on" >
            <input type="email" class="inputtext" name="email1" id="email1"/>
            <input type="password" class="inputtext" name="pass" id="pass"/>
            <input type="submit">
        </form>

        <div>
            <form action="form2">
                <input type="email" class="inputtext" name="email2" id="email2"/>
                <div><input type="password" class="inputtext" name="pass2" id="pass2"/></div>
            </form>
        </div>
</body>
</html>

Неверный вывод

формы - 2
теги ввода в form1 - 5
теги ввода в form2 - 0

1 Ответ

1 голос
/ 11 июля 2019

Лучше использовать относительный локатор XPath от текущего form вместе с нисходящей осью, чтобы собрать все вложенные input элементы, принадлежащие текущей форме

inputs =forms[i].find_elements_by_xpath("./descendant::input")

Полный код на всякий случай:

forms = driver.find_elements_by_xpath("//form")

print(f'forms - {len(forms)}')

for i in range(len(forms)):
      inputs =forms[i].find_elements_by_xpath("./descendant::input")
      print(f'input tags in form{i + 1} is {len(inputs)}')

Демо-версия:

enter image description here

Дополнительная информация:

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