【问题标题】:Python Selenium click an element if visiblePython Selenium 单击一个元素(如果可见)
【发布时间】:2018-02-13 01:55:02
【问题描述】:

使用 Python Selenium 我正在尝试检查一个元素是否可见,如果是则单击它...

# Check to see if element is visible
    myelement = driver.find_element_by_xpath("//a[@id='form1']")

    if myelement.is_displayed():
        print (" ")
    else:
        driver.find_element_by_xpath("//a[@id='form1']").click

这不起作用,我哪里出错了?

【问题讨论】:

    标签: python selenium selenium-webdriver


    【解决方案1】:

    假设你的 xpath 是正确的,你应该使用click(),而不是click。这是一个方法,而不是一个属性。

    【讨论】:

      【解决方案2】:

      你有两个问题

      • click是一个方法,应该是click()
      • 当前,如果按钮显示,您正在尝试单击。应该是

        if myelement.is_displayed():
            driver.find_element_by_xpath("//a[@id='form1']").click()
        else:
            print (" ")
        

      您也不必重新定位元素即可点击它

      myelement = driver.find_element_by_xpath("//a[@id='form1']")
      
      if myelement.is_displayed():
          myelement.click()
      else:
          print (" ")
      

      【讨论】:

        【解决方案3】:

        最好的方法是创建一个基类并重新定义 click and find 方法并使用它来代替:

        from selenium                                 import webdriver
        from selenium.webdriver.support.ui            import WebDriverWait
        from selenium.webdriver.support.select        import Select
        from selenium.webdriver.support               import expected_conditions as EC
        from selenium.webdriver.common.by             import By
        from abc                                      import abstractmethod
        
        
        
        
        class LocatorMode:
        
         XPATH = "xpath"
         CSS_SELECTOR = "cssSelector"
         NAME = "name"
         ID = "id"
         TAG_NAME = "tagName"
        
        
        class BasePage(object):
        
         def __init__(self, driver):
             self.driver = driver
        
        
         def wait_for_element_visibility(self, waitTime, locatorMode, Locator):
             element = None
             if   locatorMode == LocatorMode.ID:
                  element = WebDriverWait(self.driver, waitTime).\
                          until(EC.visibility_of_element_located((By.ID, Locator)))
             elif locatorMode == LocatorMode.NAME:
                  element = WebDriverWait(self.driver, waitTime).\
                          until(EC.visibility_of_element_located((By.NAME, Locator)))
             elif locatorMode == LocatorMode.XPATH:
                  element = WebDriverWait(self.driver, waitTime).\
                          until(EC.visibility_of_element_located((By.XPATH, Locator)))
             elif locatorMode == LocatorMode.CSS_SELECTOR:
                  element = WebDriverWait(self.driver, waitTime).\
                          until(EC.visibility_of_element_located((By.CSS_SELECTOR, Locator)))
             else:
                 raise Exception("Unsupported locator strategy.")
             return element
        
        
         def wait_until_element_clickable(self, waitTime, locatorMode, Locator):
             element = None
             if   locatorMode == LocatorMode.ID:
                  element = WebDriverWait(self.driver, waitTime).\
                          until(EC.element_to_be_clickable((By.ID, Locator)))
             elif locatorMode == LocatorMode.NAME:
                  element = WebDriverWait(self.driver, waitTime).\
                          until(EC.element_to_be_clickable((By.NAME, Locator)))
             elif locatorMode == LocatorMode.XPATH:
                  element = WebDriverWait(self.driver, waitTime).\
                          until(EC.element_to_be_clickable((By.XPATH, Locator)))
             elif locatorMode == LocatorMode.CSS_SELECTOR:
                  element = WebDriverWait(self.driver, waitTime).\
                          until(EC.element_to_be_clickable((By.CSS_SELECTOR, Locator)))
             else:
                 raise Exception("Unsupported locator strategy.")
             return element
        
        
        
         def find_element(self, locatorMode, Locator):
             element = None
             if locatorMode == LocatorMode.ID:
                element = self.driver.find_element_by_id(Locator)
             elif locatorMode == LocatorMode.NAME:
                element = self.driver.find_element_by_name(Locator)
             elif locatorMode == LocatorMode.XPATH:
                element = self.driver.find_element_by_xpath(Locator)
             elif locatorMode == LocatorMode.CSS_SELECTOR:
                element = self.driver.find_element_by_css_selector(Locator)
             else:
                raise Exception("Unsupported locator strategy.")
             return element
        
        
         def fill_out_field(self, locatorMode, Locator, text):
             self.find_element(locatorMode, Locator).clear()
             self.find_element(locatorMode, Locator).send_keys(text)
        
         def click(self, waitTime, locatorMode, Locator):
             self.wait_until_element_clickable(waitTime, locatorMode, Locator).click()
        

        【讨论】:

          【解决方案4】:

          你也可以试试/除外:

          try:
              driver.find_element_by_xpath("//a[@id='form1']").click()  # will click element if visible
          
          except:
              print "Element not visible."
          

          【讨论】:

            【解决方案5】:

            is_displayed() != 可见

            所以,如果元素不在屏幕之外,.click() 不起作用,但仍然“显示”

            正确的步骤是你必须将元素滚动到屏幕中并且可见,然后单击()

            【讨论】:

            • 欢迎来到 StackOverflow:如果您发布代码、XML 或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮 ( { } ) 或使用 Ctrl键盘上的 +K 可以很好地格式化和语法突出显示它!
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-01-02
            • 1970-01-01
            • 2017-08-14
            • 1970-01-01
            • 2016-07-18
            • 1970-01-01
            • 2015-11-30
            相关资源
            最近更新 更多