【问题标题】:Selenium automated testing error: TypeError: 'WebElement' object is not callableSelenium 自动化测试错误:TypeError: 'WebElement' object is not callable
【发布时间】:2021-04-30 09:02:16
【问题描述】:

我正在使用 Selenuium 测试一个 Django 网站。

当我运行测试时,我收到以下错误:

TypeError: 'WebElement' 对象不可调用

这是我的代码的相关sn-ps:

base.py

​​>
import os
import sys

from pathlib import Path
from selenium import webdriver
from selenium.webdriver.remote.remote_connection import LOGGER as SELENIUM_LOGGER, logging as selenium_logging
from webdriver_manager.chrome import ChromeDriverManager

sys.path.insert(0, str(Path(os.path.dirname(__file__)).parent.absolute()) )

from django.urls import reverse
from django.test import TestCase

from django.contrib.auth import get_user_model


User = get_user_model()


TESTING_URL_ROOT = os.environ.get('TESTING_URL_ROOT', 'http://127.0.0.1:8000')


# https://stackoverflow.com/questions/23407142/how-do-i-reduce-the-verbosity-of-chromedriver-logs-when-running-it-under-seleniu
SELENIUM_LOGGER.setLevel(selenium_logging.WARNING)


# https://stackoverflow.com/questions/1323455/python-unit-test-with-base-and-sub-class
class BaseTestCases:

    class BaseTest(TestCase):

        def setUp(self): 
            chrome_options = webdriver.ChromeOptions()
            chrome_options.headless = True
            chrome_options.add_argument("--disable-notifications")

            chrome_options.add_argument("disable-infobars"); # disabling infobars
            chrome_options.add_argument("--disable-extensions"); # disabling extensions
            chrome_options.add_argument("--disable-gpu"); # applicable to windows os only
            chrome_options.add_argument("--disable-dev-shm-usage"); # overcome limited resource problems
                        
            chrome_options.add_argument(f"user-data-dir={str(Path.home())}") # https://stackoverflow.com/questions/31062789/how-to-load-default-pro
            chrome_options.add_argument("user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36")

            self.browser = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options)

            # ...


        def tearDown(self):  
            self.browser.quit()


        # For Django client object, which can work with relative URLs
        def get_relative_url_from_route_name(self, route_name):
            route_name = route_name.strip()
            return f"{reverse(route_name)}"
 

        # for selenium, which requires FULL URL
        def get_full_url_from_route_name(self, route_name):
            route_name = route_name.strip()
            if not route_name:
                return TESTING_URL_ROOT
            else:
                return f"{TESTING_URL_ROOT}{reverse(route_name)}"


        # Default is set to True, because Selenium provides better UI testing
        # e.g. Javascript functionality in web page etc. 
        def resolve_url(self, route_name, full_url_path=True):
            if full_url_path:
                return self.get_full_url_from_route_name(route_name)
            else:
                return self.get_relative_url_from_route_name(route_name)

visitor.py

​​>
from base import BaseTestCases

from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By


class VisitorTest(BaseTestCases.BaseTest):  
    # ...
    def test_home_page_shows_join_us_button(self):
        url = self.resolve_url("home:index")
        self.browser.get(url)
        error_flag = self.assertRaises(NoSuchElementException, self.browser.find_element_by_id('join-us'))
        self.assertFalse(error_flag) 

    # ...

堆栈跟踪

ERROR: test_home_page_shows_join_us_button (visitor.VisitorTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests/visitor.py", line 63, in test_home_page_shows_join_us_button
    error_flag = self.assertRaises(NoSuchElementException, self.browser.find_element_by_id('join-us'))
  File "/usr/lib/python3.8/unittest/case.py", line 816, in assertRaises
    return context.handle('assertRaises', args, kwargs)
  File "/usr/lib/python3.8/unittest/case.py", line 202, in handle
    callable_obj(*args, **kwargs)
TypeError: 'WebElement' object is not callable

是什么导致了这个错误 - 我该如何解决?

以下是相关版本信息:

Selenium: 3.141.0
Django: 3.2
Python: 3.8.5
OS: Linux (Ubuntu 12.0.4 LTS)
Chrome:
  Current google-chrome version is 90.0.4430
  Get LATEST driver version for 90.0.4430

【问题讨论】:

    标签: python django selenium selenium-webdriver


    【解决方案1】:

    我想这里的问题是你试图在self.browser.get(url) 之后立即使用find_element_by_id('join-us') 元素,而网页仍未加载,所以你正在寻找的元素仍然没有出现所以find_element_by_id('join-us') 返回null

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 2022-11-20
      • 1970-01-01
      • 2020-03-27
      • 2018-03-31
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      相关资源
      最近更新 更多