selenium元素不可见的例外

我一直负责编写一个parsing器来点击一个网站上的button,我有问题只点击其中一个button。 以下代码适用于除一个button之外的每个button。

这里是html: http : //pastebin.com/6dLF5ru8

这里是源html: http : //pastebin.com/XhsedGLb

python代码:

driver = webdriver.Firefox() ... el = driver.find_element_by_id("-spel-nba") actions.move_to_element(el) actions.sleep(.1) actions.click() actions.perform() 

我得到这个错误。

 ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with 

根据Saifur我刚刚尝试等待与相同的元素不可见的exception:

 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.XPATH, "//input[contains(@id,'spsel')][@value='nba']"))).click() 

如果您查看页面源代码,您将会明白,几乎所有的SELECTDIV元素都是由JavaScript faked和创build的,这就是为什么webdriver无法查看它们。

有一个解决方法,通过使用ActionChains打开您的开发人员控制台,并注入所需的元素,实际上, 标签触发NBA数据加载一个假的 CLICK …这是一个工作的例子:

 from selenium import webdriver from selenium.webdriver.common import action_chains, keys import time driver = webdriver.Firefox() driver.get('Your URL here...') assert 'NBA' in driver.page_source action = action_chains.ActionChains(driver) # open up the developer console, mine on MAC, yours may be diff key combo action.send_keys(keys.Keys.COMMAND+keys.Keys.ALT+'i') action.perform() time.sleep(3) # this below ENTER is to rid of the above "i" action.send_keys(keys.Keys.ENTER) # inject the JavaScript... action.send_keys("document.querySelectorAll('label.boxed')[1].click()"+keys.Keys.ENTER) action.perform() 

或者replace所有的ActionChains命令,你可以简单地运行execute_script像这样:

 driver.execute_script("document.querySelectorAll('label.boxed')[1].click()") 

在那里,至less在我的本地文件,无论如何…希望这会有所帮助!

在这里输入图像描述

对我来说有效的是在有问题的元素之前find元素(就是按照Tab键的顺序),然​​后在该元素上调用Tab。

 from selenium.webdriver.common.keys import Keys elem = br.find_element_by_name("username") elem.send_keys(Keys.TAB) # tab over to not-visible element 

做完这些之后,我可以发送动作给元素。

我build议你用explicit等待的xpath

 //input[contains(@id,'spsel')][@value='nba'] 

如果“元素当前不可见”,则使其可见

FE

 >>> before is hidden top is outside of page <input type="file" style="position: absolute;top:-999999" name="file_u"> >>> after move top on in page area DRIVER.execute_script("document.getElementByName('file_u').style.top = 0;") time.sleep(1); # give some time to render DRIVER.find_element_by_name("file_u").send_keys("/tmp/img.png") 

而不是get_element_by_id()你可以尝试elem = browser.find_element_by_css_selector('#elemId') (去那个网页和元素,右键单击它和Copy CSS Selector ,或类似的东西)。这就是我所做的,它的工作原理。 你也可以尝试find_element_by_link_text(text)find_element_by_partial_link_text(text)find_element_by_tag_name(tagName_case_insensitive_here)find_element_by_name(name)等等。 在idCSS Selector是你最好的select。

这个线程的实际解决scheme并不适用于我。

然而,

这个做了:

 element = WebDriverWait(driver, 3).until(EC.visibility_of_element_located((By.XPATH, xpaths['your_xpath_path']))) 

诀窍是使用:

EC.visibility_of_element_located

WebDriverWait

WebDriverWait

从这个import:

从selenium.webdriver.support导入expected_conditions作为EC

从selenium.webdriver.support.ui导入WebDriverWait