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()
如果您查看页面源代码,您将会明白,几乎所有的SELECT
, DIV
元素都是由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)
等等。 在id
, CSS 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