【问题标题】:Create class and make it callable创建类并使其可调用
【发布时间】:2021-10-02 07:42:27
【问题描述】:

我有这些课程:

class BaseElement:
   def __init__(self, locator):
       self.locator = locator
    

class ButtonElementAndWaitNewElement(BaseElement):
   def __init__(self, locator, element_to_appear_path):
        super(ButtonElementAndWaitNewElement, self).__init__(locator)
        self.element_to_appear_path = element_to_appear_path

   def __get__(self, obj, owner):
       driver = obj.driver
       element = WebDriverWait(driver, 30).until(
        EC.element_to_be_clickable(self.locator))
       element.click()
       WebDriverWait(driver, 30).until(
           EC.presence_of_element_located(self.element_to_appear_path))

我正在使用这个创建一个元素:

class WorkerTimePage:
    time_and_expense_menu = ButtonElement(By.ID, "time_expense")
    timesheet_from_3_weeks_ago = ButtonElementAndWaitNewElement(
    (By.ID, "timesheet_id"),
    (By.XPATH, '//th[@class="workday"]'))

我基本上想要做的是在我的测试中能够只调用timesheet_from_3_weeks_ago 并从我的类中执行操作(在这种情况下,只需单击一个元素,然后等待一个新元素),我有我的测试是这样的:

from cloud_testing.login.page_objects import LoginPage
from cloud_testing.test_base import TestBase
from cloud_testing.worker.page_objects import WorkerTimePage

class TestEditTimesheet(TestBase):

     login_page = None
     worker_time_page = None

     def setup_method(self):
         super(TestEditTimesheet, self).setup_method()
         self.login_page = LoginPage(self.driver)
         self.worker_time_page = WorkerTimePage(self.driver)

     def test_worker_adds_punch_to_timesheet(self):
         self.login_page.login('bescoto@fgeneric.com', 'bescoto')
         self.worker_time_page.time_and_expense_menu.click()
         self.worker_time_page.timesheet_from_3_weeks_ago()

它会正确执行单击并等待新元素的操作,但最后会触发此错误:

self.worker_time_page.timesheet_from_3_weeks_ago()

TypeError: 'NoneType' 对象不可调用

不知道我需要改变什么来做我正在寻找的东西,感谢任何帮助。

【问题讨论】:

  • 可以分享WorkerTimePage源代码吗?
  • 对不起,'WorkerTimePage' 基本上只包含 2 个元素,'time_and_expense_menu 和另一个我已经提到的 'timesheet_from_3_weeks_ago' ,时间和费用只是一个按钮,但问题是另一个跨度>
  • 如果您编辑您的帖子并添加源代码,它会容易得多。因为self.worker_time_page.time_and_expense_menu.click() 工作正常,程序在第二种方法self.worker_time_page.timesheet_from_3_weeks_ago() 上停止,并且会有问题。这就是为什么我想看WorkerTimePage的源代码。

标签: python python-3.x selenium-webdriver webdriver


【解决方案1】:

在第一个worker_time_page你打电话:

self.worker_time_page.time_and_expense_menu.click()

第二次你错过了方法click()

self.worker_time_page.timesheet_from_3_weeks_ago() # .click() is missing

因为ButtonElementAndWaitNewElement没有实现__call__方法,python返回错误。

所以我假设你想打电话给.click()



class ButtonElementAndWaitNewElement(BaseElement):
   def __init__(self, locator, element_to_appear_path):
        super(ButtonElementAndWaitNewElement, self).__init__(locator)
        self.element_to_appear_path = element_to_appear_path

   def click(self):
       driver = obj.driver
       element = WebDriverWait(driver, 30).until(
        EC.element_to_be_clickable(self.locator))
       element.click()
       WebDriverWait(driver, 30).until(
           EC.presence_of_element_located(self.element_to_appear_path))

class TestEditTimesheet(TestBase):

     login_page = None
     worker_time_page = None

     def setup_method(self):
         super(TestEditTimesheet, self).setup_method()
         self.login_page = LoginPage(self.driver)
         self.worker_time_page = WorkerTimePage(self.driver)

     def test_worker_adds_punch_to_timesheet(self):
         self.login_page.login('bescoto@fgeneric.com', 'bescoto')
         self.worker_time_page.time_and_expense_menu.click()
         self.worker_time_page.timesheet_from_3_weeks_ago.click()  # this was changed

【讨论】:

  • 这是不对的,我不想为ButtonElementAndWaitNewElement 打电话给.click(),我为time_and_expense_menu 打电话,因为ButtonElement 不同,因为ButtonElementAndWaitNewElement 我只是想调用 timesheet_from_3_weeks_ago 并能够单击然后等待一个新元素(正是我在课堂上所拥有的),不确定我是否需要使用其他东西来代替 __get__
  • 那么对ButtonElementAndWaitNewElement 执行click() 方法就可以了,并且您的代码保持一致。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多