Python / Selenium网络驱动程序中的ElementNotVisibleException错误

时间:2018-07-30 01:29:30

标签: python selenium selenium-webdriver ui-automation web-scripting

我为网络抓取工作编写了这段代码:

browser.find_element_by_class_name('open_all_j').click()

此代码行给我一个错误:

  

selenium.common.exceptions.ElementNotVisibleException:消息:元素不可见

我的完整代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common import keys, action_chains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup as soup
import xlwt
def click_time():
    browser = webdriver.Chrome("./Drivers/chromedriver.exe")
    browser.implicitly_wait(20)
    browser.get("https://www.geegeez.co.uk/race-cards/#display=cards&day=0")

    timeTable = browser.find_elements_by_class_name('meeting')
    timeRow = timeTable[0].find_element_by_class_name("races")
    timeRowTable = timeRow.find_elements_by_class_name("race_card_race")
    timeRowTD = timeRowTable[0].find_elements_by_xpath("//table")
    x = timeRowTable[0].find_element_by_class_name("cardstable")
    y = x.find_element_by_class_name("racetime")
    y.click()
    print('\n', len(browser.find_elements_by_id('tabs-cards')), '\n')
    wait = WebDriverWait(browser, 20)
    elem = wait.until(EC.presence_of_element_located((By.ID, "tabs-cards")))
    #browser.find_element_by_xpath("//div[@class = 'open_all_r']").click() #find_element_by_class_name('open_all_r')
    browser.find_elements_by_class_name('open_all_j')[0].click()
    browser.find_elements_by_class_name('open_all_t')[0].click()

我尝试使用:

browser.find_element_by_xpath("//div[@class = 'open_all_r']").click()

此代码行给我同样的错误。

请帮助我...

3 个答案:

答案 0 :(得分:0)

之所以会发生,是因为许多原因,例如元素未滚动到视图中

driver.execute_script("arguments[0].scrollIntoView();", element)

如果这样做没有帮助,请尝试单击Java脚本

driver.execute_script("arguments[0].click();", element)

答案 1 :(得分:0)

首先,尝试捕获这是什么类型的异常。这很可能是由于两个原因-“ reason-1”:可能页面未正确滚动。 “解决方案”:使用“ javascriptexecutor ”滚动页面(解决方案由上面的其他人提供。 “ reason-2”:可能页面未完全加载(我也陷入了这个问题)。在这种情况下,解决方案是您必须等待在线程中使用sleep方法来完全加载页面。 thread.sleep(5000)

答案 2 :(得分:-1)

由于多种原因,当您尝试单击某个元素时,到那时该元素可能不可见/不可点击。

我如何克服这些情况是为这样的FindElement和FindElements提供扩展方法(代码在c#中,您可以在python中编写等效代码):

public static void FindElement(this IWebDriver driver, By by, int timeout)
{
   if(timeout >0)
    {
        return new WebDriverWait(driver, TimeSpan.FromSeconds(timeout)).Until(ExpectedConditions.ElementToBeClickable(by));
    }

 return driver.FindElement(by);
}

 public static IReadOnlyCollection<IWebElement> FindElements(this IWebDriver driver, By by, int timeout)
{
   if(timeout >0)
    {
        return new WebDriverWait(driver, TimeSpan.FromSeconds(timeout)).Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(by));
    }

 return driver.FindElements(by);
}

,您可以这样称呼:

driver.FindElement(By.Xpath("xpath"), timeout).Click();