Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 计算html表单中输入标记数的XPATH表达式_Python 3.x_Selenium Webdriver_Xpath - Fatal编程技术网

Python 3.x 计算html表单中输入标记数的XPATH表达式

Python 3.x 计算html表单中输入标记数的XPATH表达式,python-3.x,selenium-webdriver,xpath,Python 3.x,Selenium Webdriver,Xpath,我想计算HTML表单中存在的输入标记的数量 我已经将SeleniumWeb驱动程序(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'

我想计算HTML表单中存在的输入标记的数量

我已经将SeleniumWeb驱动程序(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
表1中的输入标记为3
表单2中的输入标记为2

但是当我将第二个表单包含在div标记(modified 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
表1中的输入标记为5
form2中的输入标记为0

最好使用来自当前窗体的定位器和axis来收集属于当前窗体的所有嵌套元素

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)}')
演示:

更多信息:

最好使用来自当前表单的定位器和axis来收集属于当前表单的所有嵌套元素

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)}')
演示:

更多信息:


您的
不应该是
吗?您的
不应该是
吗?我尝试在OP的修改html上运行此操作(其中第二个表单包含div标记),但仍然得到相同的错误。你能试试吗?谢谢你@Dmitri,这真的很有帮助。它不仅解决了我的问题,而且使代码简单美观。我喜欢。我只是想知道为什么当第二个表单包含在Div中时,我的代码不起作用。我试图在OP的修改后的html(其中第二个表单包含Div标记)上运行此代码,但仍然得到相同的错误。你能试试吗?谢谢你@Dmitri,这真的很有帮助。它不仅解决了我的问题,而且使代码简单美观。我喜欢。只是想知道为什么我的代码在第二个表单包含在Div中时不起作用。