Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 硒元素不可见异常_Python_Selenium - Fatal编程技术网

Python 硒元素不可见异常

Python 硒元素不可见异常,python,selenium,Python,Selenium,我的任务是编写一个解析器来单击网站上的一个按钮,而我在只单击其中一个按钮时遇到了问题。以下代码适用于除一个按钮外的每个按钮 以下是html: 以下是源html: python代码: driver = webdriver.Firefox() ... el = driver.find_element_by_id("-spel-nba") actions.move_to_element(el) actions.sleep(.1) actions.click() actions.p

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

以下是html:

以下是源html:

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()
我建议您将xpath与显式等待一起使用


如果您查看页面源代码,就会了解几乎所有select、DIV元素都是伪造的,并且是从JavaScript创建的,这就是为什么webdriver看不到它们的原因

不过,有一个解决办法,使用ActionChains打开开发者控制台,在所需元素上注入人工点击,实际上,这是触发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_脚本:

driver.execute_script("document.querySelectorAll('label.boxed')[1].click()")
好了,至少在我的本地文件上。。。希望这有帮助


对我来说,有效的方法是在有问题的元素之前找到该元素,也就是说,就制表符顺序而言,就在它之前,然后调用该元素的制表符

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

完成此操作后,我能够向元素发送操作。

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

f、 e


您可以尝试elem=browser,而不是通过id获取元素。通过css选择器“elemId”找到元素,转到该网页和元素,右键单击它并复制css选择器,或者类似的东西。这就是我所做的,它是有效的。您还可以尝试按链接文本查找元素、按部分链接文本查找元素、按标记名查找元素、不区分大小写、按名称查找元素等。这些方法都可以奏效。在id之后,CSS选择器是您的最佳选择。

此线程的实际解决方案对我不起作用

但是,

这一次:

element  = WebDriverWait(driver, 3).until(EC.visibility_of_element_located((By.XPATH, xpaths['your_xpath_path'])))
诀窍是使用:

EC.元素的可见性

网络驱动器

WebDriverWait

从这个进口:

从selenium.webdriver.support将预期的_条件导入为EC

从selenium.webdriver.support.ui导入WebDriverWait


我最终使用了@twasbrillig的解决方案,但我没有找到上一个元素并发送TAB键,而是找到了所需的元素,用该元素发送TAB键,然后再向驱动程序发送SHIFT+TAB键:

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)

我尝试使用其他方法,但最终发现最简单的方法是尝试并单击按钮,然后捕捉错误。这允许我根据它是否为真执行其他操作

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)
我用python解决这个问题的方法是:


谢谢,我只是尝试了等待,但超时了。在您提供的html中没有匹配的类名。您使用了错误的选择器或saifur,我刚刚尝试编辑。它回到了我第一次发布时的位置。如下所示:driver.find\u element\u by\u xpath//input[contains@id,'spsel'][@value='nba']相同错误:ElementNotVisibleException:消息:元素当前不可见,因此可能无法交互with@Saifur,通常它应该可以工作,但在这种情况下,如果您检查页面源,几乎所有元素都是由JavaScript伪造/动态创建的,webdriver无法看到them@user4450305,没问题,我很乐意帮忙;这实际上是一个非常棘手的问题,我花了10分钟在浏览器检查器上尝试。。。在我查看页面来源并弄清楚发生了什么之前+1回答您的问题。@Anzel操作多浏览器兼容吗?你能解释一下javascript部分吗?只是为了我的understanding@Saifur,是的,动作是多浏览器兼容的,我通常用它来查看代码和浏览器之间的所有交互动作,就像一系列动作,你可以直接看到自己在做。execute_脚本只是直接执行javascript的一种更直接的方式。关于JavaScript,因为站点中的数据基本上是由JavaScript操作的,动态地提供数据并构建DOM。例如,如果它们被设置为不可见或禁用,webdriver将看不到它们。在这种情况下,您可能希望注入脚本以实现所需的操作。我可能会遇到类似的问题:ElementNotVisibleException:error。你们知道在Robot框架中做这件事的方法吗?@Anna-我以前没用过Robot框架,但请注意selenium是集成的。因此,从理论上讲,任何适用于selenium的东西都应该适用于您的机器人框架。让我知道你进展如何。
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)
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)
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)