Selenium元素不可见异常

时间:2015-01-13 17:28:16

标签: python selenium

我的任务是编写解析器来点击网站上的按钮,我只有点击其中一个按钮时遇到问题。以下代码适用于除一个按钮之外的每个按钮。

这里是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,我只是尝试使用相同的元素等待不可见的异常:

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

9 个答案:

答案 0 :(得分:41)

如果你查看页面源代码,你就会明白几乎所有的SELECTDIV元素都是faked并且是用JavaScript创建的,这就是为什么webdriver不能看见他们。

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

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()

或者替换所有ActionChains命令,您只需像这样运行execute_script

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

你去,至少在我当地的文件上...希望这有帮助!

enter image description here

答案 1 :(得分:15)

对我来说有用的是在有问题的元素之前找到元素(就是在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

在这之后,我能够向元素发送动作。

答案 2 :(得分:3)

我建议您使用xpath explicit等待

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

答案 3 :(得分:3)

这个帖子的实际解决方案对我不起作用。

然而,

这个人做了:

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

诀窍是使用:

  

EC.visibility_of_element_located

WebDriverWait

  

WebDriverWait

来自此导入:

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

     

来自selenium.webdriver.support.ui导入WebDriverWait

答案 4 :(得分:1)

如果"元素当前不可见"然后让它 VISIBLE

f.e。

>>> 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")

答案 5 :(得分:0)

而不是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)等等。 id之后CSS Selector是您最好的选择。

答案 6 :(得分:0)

我最终使用了@twasbrillig的解决方案,但是我没有找到前一个元素并发送TAB键,而是找到了所需的元素,将TAB键与该元素一起发送,然后将SHIFT + TAB键发送给了驱动程序: / p>

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()  
el = driver.find_element_by_id("-spel-nba")
el.send_keys(Keys.TAB)
webdriver.ActionChains(driver).key_down(Keys.SHIFT).send_keys(Keys.TAB).key_up(Keys.SHIFT)

答案 7 :(得分:0)

我尝试使用其他方法,但最后发现最简单的方法是尝试单击按钮并捕获错误。这使我可以根据是(正确)还是没有(错误)执行其他操作。

def click_button(html_object):
 try:
  html_object.click()
 except:
  return False #most likely because it is NotVisible object and can be ignored
 return True

...
...
click_button(actions)

答案 8 :(得分:0)

我在python中解决此问题的方式是:

try:
    # the element you want to scroll to
    element = driver.find_element_by_id("some_id") 
    ActionChains(driver).move_to_element(element).perform()
    element.send_keys(Keys.TAB).key_up(Keys.SHIFT)
    #element.click()
except Exception as e:
    print(e)