【问题标题】:Explicit waits doesn't work on PayPal sandbox which based on Angular显式等待不适用于基于 Angular 的 PayPal 沙箱
【发布时间】:2021-02-23 06:33:58
【问题描述】:

我对 Selenium Python 的 PayPal 沙箱自动化有疑问。 通常,我在按钮中为每个操作方法(如send_keys()click())编写了显式等待,但它们只是不起作用。我尝试了几乎所有可用的显式等待。

我试图通过执行 javascript 来调整等待 Angular 脚本完全加载的方法,但由于这个基于 Angular v.1. 的应用程序,它完全不起作用。 例如:

while self.context.browser.execute_script(
"return angular.element(document).injector().get('$http').pendingRequests.length === 0"):
             sleep(0.5)

唯一有效的方法是静态python sleep,这是完全不合适的!但是,当我在页面上的每个第一个操作之间添加 2 秒的睡眠时间时,测试通过没有任何问题,而我尝试将 sleep 替换为例如 WebDriverWait(self.context.browser, timeout=15).until(EC.visibility_of_all_elements_located) ,当所有元素在页面上可见时测试停止。 有人可以处理吗? 我的代码女巫睡在每个页面对象之间:

context.pages.base_page.asert_if_url_contain_text("sandbox.paypal.com")
context.pages.paypal_login_page.login_to_pp_as(**testPP)
sleep(2)
context.pages.choose_payment_page.pp_payment_method("paypal")
sleep(2)
context.pages.pay_now_page.click_pay_now()
sleep(2)
context.pages.finish_payment_page.click_return_to_seller()
sleep(5)
context.pages.base_page.open()

显式等待的示例方法:

def click_pay_now(self):
    WebDriverWait(self.context.browser, timeout=15).until(EC.visibility_of_all_elements_located)
    self.pay_now_button.is_element_visible()
    self.pay_now_button.click()

【问题讨论】:

    标签: python angular selenium paypal-sandbox webdriverwait


    【解决方案1】:

    visibility_of_all_elements_located() 将返回一个 list,而您需要使用 visibility_of_element_located(),它将返回一个 WebElement

    理想情况下,如果您的用例是调用click(),那么您需要为element_to_be_clickable() 诱导WebDriverWait,您可以使用以下任一Locator Strategies

    • 使用CSS_SELECTOR

      WebDriverWait(self.context.browser, timeout=15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "element_css"))).click()
      
    • 使用XPATH

      WebDriverWait(self.context.browser, timeout=15).until(EC.element_to_be_clickable((By.XPATH, "element_xpath"))).click()
      
    • 注意:您必须添加以下导入:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      

    参考

    您可以在以下位置找到相关的详细讨论:

    【讨论】:

    • 首先我尝试在单个元素上使用等待,其方式与您的提示完全相同,但 Selenium 对此没有反应。当我对自己能做什么没有任何想法时,我试图使用任何等待,例如visibility_of_all_elements_located () ,但它也不起作用,现在我知道为什么了。感谢您的帮助!;)
    【解决方案2】:

    Selenium wait 有时不适用于基于AngularJsreactJs 的应用程序,这就是为什么量角器是基于AngularJsreactJs 的应用程序的最佳工具。虽然我希望如果您可以尝试以下解决方案,它可以基于Javascript 工作。

    一个函数会检查页面是否完全加载。

      def page_has_loaded():
        page_state = browser.execute_script(
          'return document.readyState;'
        ) 
        return page_state == 'complete'
    

    然后将等待与非常短的睡眠时间结合使用,一旦加载页面,睡眠时间可能会更短。

    def wait_for(condition_function):
      start_time = time.time() 
      while time.time() < start_time + 2: 
        if condition_function(): 
          return True 
        else: 
          time.sleep(0.1) 
      raise Exception(
       'Timeout waiting for {}'.format(condition_function.**name**) 
      )
    

    你可以这样称呼它:

    wait_for(page_has_loaded)
    

    【讨论】:

    • 您的解决方案有效!非常感谢!:) 我正在使用 Python,因为我测试的大多数应用程序都基于 php code 。我不知道AngularJsReactJs 有时会出现问题。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2016-07-13
    • 2016-05-07
    • 2016-05-26
    • 2019-08-01
    • 2016-05-04
    • 1970-01-01
    • 2015-06-18
    相关资源
    最近更新 更多