通过find_element_by_xpath标识的元素返回selenium.common.exceptions.ElementNotVisibleException:消息:元素不可见

时间:2018-05-04 20:33:45

标签: python selenium-webdriver

我点击按钮有问题。如果敌人在场,此按钮可以点击,如果敌人外出则无法点击 开始 我试过这个:

try:
    element= driver.find_element_by_xpath("//button[@class='butwb']")
    if element.is_displayed():       
        print ("Element found")
    else:
        print ("Element not found")
except NoSuchElementException:
    print("No element found") 

结果:

Element not found

如果我添加element.click()

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

我做错了什么?

2 个答案:

答案 0 :(得分:1)

此错误消息......

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

...暗示您尝试互动的元素不可见

标识元素的以下代码行是成功的,因为该元素存在于HTML DOM中:

element= driver.find_element_by_xpath("//button[@class='butwb']")

此时值得一提的是,元素的存在意味着该元素存在于页面的DOM上。这并不意味着元素可见(即显示)可互动(即可点击)

  

可见性表示该元素不仅会显示,而且其高度和宽度也会大于0.

因此 is_displayed() 方法返回 false 并执行else{}块打印:

Element not found

此外,当您调用 click() 时,会引发以下异常:

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

可能的原因

  • 您采用的定位器策略无法识别该元素,因为它不在浏览器的Viewport内。

  • 您采用的定位器策略并非唯一标识 HTML DOM 中的所需元素,并且当前找到其他元素隐藏 / 隐藏元素。

  • 您采用的定位器策略标识了元素,但由于属性 style =“display:none;”的存在而不可见。

  • WebElement 可能出现在模态对话框中,可能无法立即显示/可互动。

解决方案

  • 使用execute_script()方法滚动元素以进行查看,如下所示:

    elem = driver.find_element_by_xpath("element_xpath")
    driver.execute_script("arguments[0].scrollIntoView();", elem);
    

    您可以在此处找到有关Scrolling to top of the page in Python using Selenium

  • 的详细讨论
  • 包含您采用的定位器策略并未唯一标识HTML DOM中的所需元素,并且当前找不到其他隐藏 / 不可见元素作为您必须更改定位器策略的第一个匹配。

  • Incase元素具有 style =“display:none;”属性,通过executeScript()方法删除属性,如下所示:

    elem = driver.find_element_by_xpath("element_xpath")
    driver.execute_script("arguments[0].removeAttribute('style')", elem)
    elem.send_keys("text_to_send");
    
  • 如果该元素在 HTML DOM 中不立即存在 / 可见 / 可互动,将WebDriverWaitexpected_conditions设置为正确的方法,如下所示:

    • 等待presence_of_element_located

      element = WebDriverWait(driver, 20).until(expected_conditions.presence_of_element_located((By.XPATH, "element_xpath']")))
      
    • 等待visibility_of_element_located

      element = WebDriverWait(driver, 20).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "element_css")
      
    • 等待element_to_be_clickable

      element = WebDriverWait(driver, 20).until(expected_conditions.element_to_be_clickable((By.LINK_TEXT, "element_link_text")))
      

答案 1 :(得分:0)

在与Kuncioso交谈并进入游戏后,我们发现有两个按钮与他的定位器匹配,第一个被隐藏。使用下面的代码解决问题,点击第二个按钮,即他想要的按钮。

driver.find_elements_by_xpath("//button[@class='butwb']")[1].click()