【问题标题】:Managing multiple instances of Selenium in Python在 Python 中管理多个 Selenium 实例
【发布时间】:2014-08-05 17:08:46
【问题描述】:

我正在尝试能够同时管理多个 Selenium 实例,但运气不佳。我不是 100% 确定这是否可能。我有一个使用 PyQT 构建的 GUI 应用程序,它从我们的 SQL 数据库中检索我们客户的信息。这是一个相当简单的应用程序,可让我们的用户轻松登录和退出客户的帐户。他们单击客户端的名称,按“登录”,它会启动一个 Firefox 实例,登录到帐户并保持打开状态,以便用户可以做任何他们需要做的事情。完成后,他们单击“注销”按钮,然后退出帐户并退出 webdriver 实例。

我试图提供的是一种让他们一次登录多个帐户的方法,同时仍然保持点击他们登录的客户名称之一、处理该帐户的注销并关闭的能力该浏览器实例。

我希望能够通过进程 ID 或唯一 ID 控制网络驱动程序,我可以在其中存储将其链接到该客户端的字典,因此当他们在应用程序中单击客户端的名称时,然后按注销,它使用 PyQT 中的某些内容,例如“client_name = self.list_item.currentItem().text()”来获取他们选择的客户端的名称(我也已经将其用于其他事情),找到唯一 ID 或进程 ID,并将注销命令发送到该实例,然后关闭该实例。

这可能不是最好的方法,但这是我唯一能想到的。

编辑:我也知道您可以使用 driver.session_id 检索 Selenium session_id(考虑到您的 webdriver 实例被分配为“驱动程序”),但到目前为止我还没有看到能够通过此 session_id 控制 webdriver 实例.

EDIT2:这是我所拥有的令人难以置信的精简版本:

from selenium import webdriver
from PyQt4 import QtGui, QtCore


class ClientAccountManager(QtGui.QMainWindow):

    def __init__(self):

        super(ClientAccountManager, self).__init__()

        grid = QtGui.QGridLayout()
        # Creates the list box
        self.client_list = QtGui.QListWidget(self)

        # Populates the list box with owner data
        for name in client_names.itervalues():
            item = QtGui.QListWidgetItem(name)
            self.client_list.addItem(item)

        # Creates the login button
        login_btn = QtGui.QPushButton("Login", self)
        login_btn.connect(login_btn, QtCore.SIGNAL('clicked()'), self.login)

        # Creates the logout button
        logout_btn = QtGui.QPushButton("Logout", self)
        logout_btn.connect(logout_btn, QtCore.SIGNAL('clicked()'), self.logout)


    def login(self):

        # Finds the owner info based on who is selected
        client_name = self.client_list.currentItem().text()
        client_username, client_password = get_credentials(client_name)

        # Creates browser instance
        driver = webdriver.Firefox()

        # Logs in
        driver.get('https://www.....com/login.php')
        driver.find_element_by_id('userNameId').send_keys(client_username)
        driver.find_element_by_id('passwordId').send_keys(client_password)
        driver.find_element_by_css_selector('input[type=submit]').click()


    def logout(self):

        # Finds the owner info based on who is selected
        client_name = self.client_list.currentItem().text()

        # Logs out
        driver.get('https://www....com/logout.php')

        # Closes the browser instance
        driver.quit()


def main():

    app = QtGui.QApplication(sys.argv)
    cpm = ClientAccountManager()
    cpm.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

【问题讨论】:

  • driver 是 login() 中的一个局部变量,您不会保留在任何地方
  • 它实际上存储方式不同,但我只是删除了我认为不相关的部分代码。 driver 全局存储
  • 如果驱动程序是全局的,那么您只保留对最后一个驱动程序的引用。通过用户名或其他内容将它们放入字典中。
  • @JasonS 天哪,我什至没有想到这一点。完美运行!谢谢

标签: python python-2.7 selenium selenium-webdriver


【解决方案1】:

您可以拥有多个驱动程序。只需多次致电webdriver.Firefox() 并保留对每个驱动程序的引用。有些人报告奇怪的行为,但它基本上是有效的。

driver.close() 将关闭浏览器并且不获取 id。

【讨论】:

  • 您能否举例说明如何在启动另一个实例后保持引用而不会失去对它的控制,并且以后能够与之通信?每次我调用第二个实例时,它都会用第二个实例覆盖第一个实例。
  • 我没有做任何特别的事情,只是创建了 2 个网络驱动程序并在每个驱动程序中获取一个页面。您能否发布一段简短的摘录,说明您是如何使用它们的?
  • 创建 2 个网络驱动程序不是问题。问题在于,一旦创建了第二个,就能够控制第一个,因为它会用新实例覆盖 driver 变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多