Python Selenium - Chrome、Firefox 和 IE 的通用脚本
我们目前正在研究Selenium作为一种测试工具,用于嵌入在各种控制器中的网络服务器。我希望能在所有驱动程序中重用相同的Python(2.7)代码,但虽然Chrome和Firefox运行得很好,IE11(真是意外?)却不喜欢它。IE打开了,但随后Python抛出了一个异常。
起初我以为问题只是出在URL中包含的用户名和密码上……
driver.get("http://" + "acc:acc@10.169.89.97")
但是即使在去掉登录信息后,手动输入登录信息,后面的代码……
(driver.switch_to.frame("links_frame")
也还是失败了。
是不是驱动程序之间有什么不同导致了这个问题?我看到其他人成功地在所有浏览器中重用了相同的代码,所以我得想想我是不是做错了什么?
具体情况:
在第一个例子中……
…第25行, driver.get("http://" + "acc:acc@10.169.89.97")
…\webdriver.py,第185行,执行 self.execute(Command.GET, {'url': url})
…\webdriver.py,第173行,执行 self.error_handler.check_response(response) …\errorhandler.py,第164行,执行 raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: 消息: u'无法导航到 acc:acc@10.169.89.97。这通常意味着调用COM方法IWebBrowser2::Navigate2()失败了.'
在第二个例子中:
…第33行, driver.switch_to.frame("links_frame") # 选择包含下一个测试元素的iframe …\webdriver\remote\switch_to.py,第64行,执行 self._driver.execute(Command.SWITCH_TO_FRAME, {'id': frame_reference})
…\webdriver.py,第173行,执行 self.error_handler.check_response(response)
…\webdriver\remote\errorhandler.py,第164行,执行 raise exception_class(message, screen, stacktrace) selenium.common.exceptions.UnexpectedAlertPresentException: 消息: u'存在模态对话框' – –
3 个回答
你说得对。现代版本的IE浏览器不允许你在网址里传递基本认证的用户名和密码。不过,大多数其他浏览器还是可以这样做的。
首先来回答你问题的第一部分...
一开始我以为问题只是出在URL中的用户和密码上
你说得对。现代版本的IE浏览器不允许你在URL中传递基本认证的用户名和密码。而大多数其他浏览器还是允许这样做的。
想了解更多,可以查看微软的知识库文章:834489
(注意:有一些方法可以关闭这种行为,但还有更好的方式来处理认证问题)
IE浏览器真让人头疼……不过问题不应该出在Python上。确保你所有的保护模式设置在各个区域都是一致的(要么都启用,要么都禁用)。否则,IEDriver在打开窗口后会失去控制,这可能和你遇到的问题类似。
你完全可以用同样的代码来进行所有测试……只是驱动部分会有所不同,但它们都是基于同一个基础类和接口。对于Python来说,就是导入相同的库。
这里有一些关于IE的参考资料:在IE11上使用Selenium WebDriver