Почему я получаю ResourceWarning больше, чем Chrome в Edge? - PullRequest
0 голосов
/ 08 мая 2020

Я уже некоторое время работаю над кроссбраузерным тестированием со своей командой и разобрал свои Chrome тесты.

Итак, сегодня я решил попробовать запустить тесты Edge моего товарища по команде и получаю сообщение ResourceWarning: Enable tracemalloc to get the object allocation traceback как сумасшедшее. Примерно каждую секунду или около того он распечатывает от 1 до 3 одного и того же сообщения.

Я помню, как время от времени получал это сообщение при запуске Chrome тестов в начале, но никогда не доходил до крайности, которую я получил от Edge.

Я провел небольшое исследование ( 1 , 2 , 3 ), поэтому я знаю, что это не влияет на мой запуск Selenium.

Но мне любопытно, что происходит за кулисами, чтобы вызвать это больше на Edge, чем на Chrome.

Для уточнения c информации о моем Edge Driver я Я использую версию с сайта Microsoft для Edge версии 80.0.361.66. Я провел небольшое тестирование конфигурации, чтобы увидеть, имеет ли это какое-либо значение (версия драйвера и версия Edge), но все равно та же сумма.

Это особенно странно, потому что 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()

Я проводил больше исследований по этому поводу, и, в частности, эта ошибка указывает на строку 374 из этого файла в удаленном драйвере Selenium.

При ближайшем рассмотрении, он попадает в условие if в строке 374 и просто не знает, что делать, поэтому терпит неудачу. Но почему?

Ответы [ 2 ]

0 голосов
/ 13 мая 2020

Обновитесь до msedge v81 и используйте selenium == 4.0.0a5, где вам нужно использовать:

    options = EdgeOptions()
    #options.add_argument('headless')
    #options.add_argument('disable-gpu')
    options.add_argument('log-level=0')
    options.use_chromium = True
    #options.binary_location = r"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe"
    self.driver = Edge(options=options)

На старых версиях селена в Edge () нет ключа use_chromium. Он медленнее, чем Chrome, и выводит много отладочной информации в стандартный вывод.

0 голосов
/ 12 мая 2020

Я проверил ваш код на своей стороне, он покажет следующую ошибку: «ResourceWarning: unclosed»

Мы могли бы попытаться игнорировать это предупреждение, используя следующий код:

Python 3 скрипта:

if __name__ == '__main__':
    unittest.main(warnings='ignore')

Более подробную информацию см. Python 3 документа unittest .

Кроме того, вы также можете обратиться к этой ветке , чтобы закрыть ресурс.

...