【问题标题】:Selenium find element with form actionSelenium 查找具有表单操作的元素
【发布时间】:2020-10-06 19:05:36
【问题描述】:

我目前正在尝试使用 Selenium 开发一个程序来自动测试网站的登录表单。

我正在尝试使用 Selenium 在我正在测试的网站上查找表单,但我注意到不同的网站具有不同的表单名称、表单 ID,甚至没有两者兼有的网站。 但根据我的观察,我注意到表单操作始终存在,我使用下面的代码来检索表单操作的名称

request = requests.get("whicheverwebsite")
parseHTML = BeautifulSoup(request.text, 'html.parser')
htmlForm = parseHTML.form
formName = htmlForm['action'] 

我正在尝试检索表单,然后使用 form.submit() 提交。

我知道 find_element_by_name 和 find_element_by_name 这两个函数,但由于我试图通过操作查找元素,但我不确定如何做到这一点。

【问题讨论】:

    标签: python python-2.7 selenium selenium-webdriver


    【解决方案1】:

    我建议包括您尝试抓取的一两个网站的网址以及您的完整代码。根据以上信息,您似乎使用的是 BeautifulSoup 而不是 Selenium。

    我会使用以下内容:

    from selenium import webdriver
    
    
    url = 'https://whicheverwebsiteyouareusing.com'
    driver = webdriver.Chrome()
    
    driver.get(url)
    

    从那里您有许多选项可以选择表单,但同样,如果没有实际站点,我们无法确定哪个最相关。我建议阅读 https://selenium-python.readthedocs.io/locating-elements.html 以找出最适合您的情况。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我已经找到了答案。

      通过使用 xpath 并使用表单和操作,我能够实现这一点。

      form = driver.find_element_by_xpath("//form[@action='" + formName + "']")
      

      【讨论】:

        【解决方案3】:

        请记住,即使您只看到一个,登录页面也可以有多个 form 标签。这是Example,当登录页面只有一个可见表单时,虽然 DOM 中有 3 个。

        所以最可靠的方法是深入表单(如果有多个)并检查两件事:

        • 如果有[type=password]元素(我们肯定需要密码才能登录)
        • 如果那里有第二个输入(虽然它可以被认为是可选的)

        Ruby 示例:

        forms = page.all(:xpath, '//form')  # retrieve all the forms and iterate
        forms.each do |form|
           # if there's a password field             if there's two input fields in general
          if form.has_css?('input[type=password']) && form.all(:xpath, '//input').count == 2)
            return form
          end
        end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-28
          • 1970-01-01
          • 2022-12-02
          • 1970-01-01
          相关资源
          最近更新 更多