【发布时间】: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