【发布时间】:2020-05-08 20:33:55
【问题描述】:
我已经和我的团队一起进行跨浏览器测试已经有一段时间了,我已经整理了我的 Chrome 测试。
所以今天我决定尝试运行我队友的 Edge 测试,我收到了 ResourceWarning: Enable tracemalloc to get the object allocation traceback 消息,就像疯了一样。大约每秒左右它会打印出 1 到 3 条相同的消息。
我记得在开始时运行 Chrome 测试时偶尔会收到此消息,但从来没有像我从 Edge 得到的那样多。
我做了一些小的研究(1、2、3)所以我知道这不会影响我的 Selenium 运行。
但我很好奇发生了什么幕后的事情,导致 Edge 比 Chrome 更容易发生这种情况。
有关我的 Edge 驱动程序的具体信息,我使用的是 Microsoft 网站上的 Edge 版本 80.0.361.66。我确实做了一些配置测试,看看是否有任何区别(驱动程序版本和边缘版本),但数量仍然相同。
这很奇怪,因为 Edge 使用 Chromium。我想知道这是否是 Selenium 如何控制 Edge 的问题。
这是 Chrome 的最低可行代码示例
import time
import unittest
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
class test_state(unittest.TestCase):
@classmethod
def setUp(self):
self.driver = Chrome('__tests__/drivers/chromedriver.exe')
self.driver.maximize_window()
self.driver.get("https://adbanker.com/")
def test_state(self):
try:
url = self.driver.current_url
print(url)
time.sleep(5)
title = self.driver.title
print(title)
WebDriverWait(self.driver, 10).until(ec.visibility_of_element_located((By.XPATH,'//*[@id="for"]')))
lr = WebDriverWait(self.driver, 10).until(ec.visibility_of_element_located((By.ID,'statenav')))
lr.click()
ce = WebDriverWait(self.driver, 10).until(ec.visibility_of_element_located((By.XPATH,'//*[@id="line_dropdown"]/option[3]')))
ce.click()
ca = WebDriverWait(self.driver, 10).until(ec.visibility_of_element_located((By.XPATH,'//*[@id="state_dropdown"]/option[6]')))
ca.click()
time.sleep(5)
except:
raise
@classmethod
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
这是 Edge 的最小可行代码示例
import time
import unittest
from selenium.webdriver import Edge
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
class test_state(unittest.TestCase):
@classmethod
def setUp(self):
self.driver = Edge('__tests__/drivers/msedgedriver.exe')
self.driver.maximize_window()
self.driver.get("https://adbanker.com/")
def test_state(self):
try:
url = self.driver.current_url
print(url)
time.sleep(5)
title = self.driver.title
print(title)
WebDriverWait(self.driver, 10).until(ec.visibility_of_element_located((By.XPATH,'//*[@id="for"]')))
lr = WebDriverWait(self.driver, 10).until(ec.visibility_of_element_located((By.ID,'statenav')))
lr.click()
ce = WebDriverWait(self.driver, 10).until(ec.visibility_of_element_located((By.XPATH,'//*[@id="line_dropdown"]/option[3]')))
ce.click()
ca = WebDriverWait(self.driver, 10).until(ec.visibility_of_element_located((By.XPATH,'//*[@id="state_dropdown"]/option[6]')))
ca.click()
time.sleep(5)
except:
raise
@classmethod
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
我一直在对此进行更多研究,特别是这个错误指向 Selenium 远程驱动程序中 this file 的第 374 行。
经过仔细检查,它在第 374 行遇到了一个 if 条件,只是不知道该怎么做,所以它失败了。但是为什么呢?
【问题讨论】:
-
不知道完整的答案,但 c 中的“malloc”正在抓取一定大小的内存分配。那么 trace malloc 可能会返回那些内存分配的地址?您使用的是原始 Edge 还是 Edgium? Edgium(仍然命名为 Edge)是 edge,但它现在使用的是 chrome 引擎,如 google chrome。
-
我正在使用 Edgium。我忘记将其标记为 Python,但您了解 trace malloc 的作用。它用于确定为对象分配内存的位置。导入后,您可以使用它来查找内存泄漏并比较某些点的内存快照。
-
你能像Minimal, Complete, and Verifiable example那样发布足够的代码来重现问题吗?可能你正在使用 tracemalloc 模型来跟踪 Python 分配的内存块,或者如this link 所说,你忘记关闭文件了。
-
@ZhiLv-MSFT 按要求添加。即使在这个简单的示例中,我也会收到重要的 ResourceWarnings。很奇怪。
标签: python selenium selenium-chromedriver microsoft-edge