我的任务是编写解析器来点击网站上的按钮,我只有点击其中一个按钮时遇到问题。以下代码适用于除一个按钮之外的每个按钮。
这里是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()
答案 0 :(得分:41)
如果你查看页面源代码,你就会明白几乎所有的SELECT
,DIV
元素都是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()")
你去,至少在我当地的文件上...希望这有帮助!
答案 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)