【问题标题】:Python: Automatic form filling using Selenium gives ErrorPython:使用 Selenium 自动填写表单会产生错误
【发布时间】:2018-01-12 10:31:29
【问题描述】:

每当我尝试执行以下错误时,我都会尝试使用 selenium 访问网站:

ElementNotVisibleException: Message: element not visible

代码如下:

from urllib import parse
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys

class ICAIScraper(object):
    def __init__(self):
        self.url = "https://www.icaionlineregistration.org/Admin_Module/Login.aspx"
        self.driver = webdriver.Chrome('C:\\chromedriver.exe')

    def scrape(self):
        self.driver.get(self.url)
        wait = WebDriverWait(self.driver, 10)
        wait.until(lambda driver: driver.find_element_by_id('txt_username').is_displayed() == False)
        print('Yay! on the first page')
        username = self.driver.find_element_by_id('txt_username')
        username.click()
        username.send_keys('username')
        password = self.driver.find_element_by_id('txt_password')
        password.send_keys('password')
        password.send_keys(Keys.ENTER)
        self.driver.quit()

if __name__ == '__main__':
   scraper = ICAIScraper()
   scraper.scrape()  

【问题讨论】:

  • 能否请您添加完整的错误跟踪。需要了解哪个 UI 元素不可见。

标签: python selenium selenium-webdriver web-scraping


【解决方案1】:

编写一个简单的函数,通过 id 滚动到任何 UI 元素(或者您可以使用 By 类对其进行自定义)。通过提供元素的id 属性来调用该方法将使该元素成为driver 的焦点。

def scroll_to_element_by_id(driver, element_id):
    driver.execute_script("return arguments[0].scrollIntoView();", driver.find_element_by_id(element_id))

示例调用:

scroll_to_element_by_id(self.driver, 'txt_password')

【讨论】:

  • 调用后我必须做与示例代码中相同的事情吗?
  • 是的,只需在你的类之外/之上创建一个方法ICAIScraper 并像scroll_to_element_by_id(self.driver, '<target element id>') 一样调用它
  • 如果回答了您的问题,请随时标记为最佳答案。! :)
【解决方案2】:

错误说明了一切:

ElementNotVisibleException: Message: element not visible

当您尝试通过id 属性定位UsernamePassword 字段时,这些字段不是唯一标识的。所以我们必须采用一个Locator Strategy来唯一标识UsernamePassword字段,如下:

# populate the Username field
self.driver.find_element_by_xpath("//td/img[@src='../images/login_userName.png']//following::input[2]").send_keys("username")
# populate the Password field
self.driver.find_element_by_xpath("//td/img[@src='../images/login_password.png']//following::input[2]").send_keys("password")

【讨论】:

  • 它给出以下错误 WebDriverException: Message: unknown error: cannot focus element
猜你喜欢
  • 1970-01-01
  • 2021-07-23
  • 2018-10-26
  • 2020-10-18
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
相关资源
最近更新 更多