奇怪的Python Selenium按钮单击行为

奇怪的Python Selenium按钮单击行为,python,selenium,web-scraping,Python,Selenium,Web Scraping,我尝试单击的部分: <ul class="btns right"> <li><a href="javascript:void(0)" onclick="hr_expand_event_tab_all(&quot;&quot;)" class="expand-all" id="btn_expand_all_10580503">View All Cards</a></li> </ul> 给出: <clas

我尝试单击的部分:

<ul class="btns right">
<li><a href="javascript:void(0)" onclick="hr_expand_event_tab_all(&quot;&quot;)" class="expand-all" id="btn_expand_all_10580503">View All Cards</a></li>
</ul>
给出:

<class 'selenium.common.exceptions.ElementNotVisibleException'>
结果是一样的。我也尝试了一些正则表达式来捕捉id的变化,但我不确定我哪里出了问题。有一个onlick,它已加载,但我看不见它

如果有人能告诉我这件事我做错了什么,我将不胜感激

/更新:

这个按钮有多个版本,有些是可见的,有些是不可见的

我循环说:

loadbutton = Driver.find_elements_by_xpath("//a[@class='expand-all']")
for button in loadbutton:
  print "button found"
结果出现了多个结果。前面的部分是隐藏的,但最后的部分肯定会显示在我的浏览器和屏幕截图上。因此,我预计早期的测试将失败,并添加了一个.click(),并添加了一个try:except:,但它们仍然失败。没想到

进一步更新:

所以我运行了这个:

loadbutton = Driver.find_elements_by_xpath("//a[@class='expand-all']")
for button in loadbutton:
  print "button found"
  try:
    button.click()
  except:
    e = sys.exc_info()[0]
    print e
第一对夫妇给了我这个:

<class 'selenium.common.exceptions.ElementNotVisibleException'>

好的,CSS正在隐藏它。显示的最后两个示例给出了以下信息:

<class 'selenium.common.exceptions.WebDriverException'>

这样它就可以看到它们了。它不会点击它们。“公共异常”似乎没有太大帮助。

尝试使用此xpath(使用代码块更新,以便站点删除my*)

/*[包含(concat(“”,@class'),'btns right')]/*[包含(concat(“”,@class'),'expand all')和包含(text(),'View all Cards')]

提供一些等待,等待元素可单击(建议使用隐式)

我只使用了java,但我在这里提到了python,它可能会有所帮助

from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
button = wait.until(EC.element_to_be_clickable((By.XPATH,'//*[contains(concat(' ', @class, ' '), ' btns right ')]//*[contains(concat(' ', @class, ' '), ' expand-all ') and contains(text(), 'View All Cards')]')))
button.click()


Even if the above thing fails, try this
形成这些链接并

在所需元素上注入人工单击,删除(注释)所有其他代码

可能你的应用程序属于link2 OP:)

试试这个xpath(用代码块更新,所以网站删除了我的*)

/*[包含(concat(“”,@class'),'btns right')]/*[包含(concat(“”,@class'),'expand all')和包含(text(),'View all Cards')]

提供一些等待,等待元素可单击(建议使用隐式)

我只使用了java,但我在这里提到了python,它可能会有所帮助

from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
button = wait.until(EC.element_to_be_clickable((By.XPATH,'//*[contains(concat(' ', @class, ' '), ' btns right ')]//*[contains(concat(' ', @class, ' '), ' expand-all ') and contains(text(), 'View All Cards')]')))
button.click()


Even if the above thing fails, try this
形成这些链接并

在所需元素上注入人工单击,删除(注释)所有其他代码



可能你的应用程序属于link2 OP:)

似乎按钮是用css隐藏的。在浏览器中获取此页面时,是否可以看到该按钮?/*/a[contains(text(),'View All Cards')]尝试此xpath,您的xpath构造似乎不正确,为什么按钮有id时会使用xpath?@e4c5考虑到id中的数字,我猜它可能是自动生成的id。id似乎是动态的..框架生成..似乎按钮是使用css隐藏的。在浏览器中获取此页面时,是否可以看到该按钮?/*/a[contains(text(),'View All Cards')]尝试此xpath,您的xpath构造似乎不正确,为什么按钮有id时会使用xpath?@e4c5考虑到id中的数字,我猜它可能是自动生成的id。id似乎是动态的..框架生成..感谢您的建议。它抛出了InvalidSelectorException,而xpath是我无法理解的,所以我没有调试的机会。也就是说,我只是再次更新了这个问题,我不认为问题在于发现它们在css隐藏的问题中循环失败,因为在点击时没有找到它们,但后面的问题只是抛出了一个常见的异常。这对我来说意味着它发现它们使用类只是因为一些“常见”的原因而无法单击它们。xpath非常有效,令人印象深刻,但不幸的是,它得到了与使用类名完全相同的结果。尝试了它。实际上,在某一点上让它等待了10分钟。它在页面上呈现,它找到所有按钮,异常处理css隐藏的按钮,并向它可以看到但由于某种原因不想单击的按钮抛出一个common.exception。()我以前从未见过类似的情况。不过,为这个建议干杯。你是一个了不起的人。施展了一种魅力,我从来不知道这是件好事。谢谢你的建议。它抛出了InvalidSelectorException,而xpath是我无法理解的,所以我没有调试的机会。也就是说,我只是再次更新了这个问题,我不认为问题在于发现它们在css隐藏的问题中循环失败,因为在点击时没有找到它们,但后面的问题只是抛出了一个常见的异常。这对我来说意味着它发现它们使用类只是因为一些“常见”的原因而无法单击它们。xpath非常有效,令人印象深刻,但不幸的是,它得到了与使用类名完全相同的结果。尝试了它。实际上,在某一点上让它等待了10分钟。它在页面上呈现,它找到所有按钮,异常处理css隐藏的按钮,并向它可以看到但由于某种原因不想单击的按钮抛出一个common.exception。()我以前从未见过类似的情况。不过,为这个建议干杯。你是一个了不起的人。施展了一种魅力,我从来不知道这是一件事。
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
button = wait.until(EC.element_to_be_clickable((By.XPATH,'//*[contains(concat(' ', @class, ' '), ' btns right ')]//*[contains(concat(' ', @class, ' '), ' expand-all ') and contains(text(), 'View All Cards')]')))
button.click()


Even if the above thing fails, try this
driver.execute_script("document.getElementsByClassName('expand-all')[0].click();")