单击期间Selenium中的ElementNotVisibleException

时间:2018-01-31 01:31:52

标签: python html selenium

我正在尝试点击HTML看起来像

的按钮
<div class="product-details-options-size clearfix">
   <p>Choose memory capacity </p>
   <div class="btn-group" data-toggle="buttons">
      <div class="active"> <label class="btn plain active"> <input type="radio" name="storageSize" value="32" autocomplete="off" checked="">32GB </label> </div>
      <div class=""> <label class="btn plain "> <input type="radio" name="storageSize" value="128" autocomplete="off">128GB </label> </div>
   </div>
</div>

enter image description here 它的代码是:

btn = browser.find_elements_by_xpath("//input[@type='radio' and @name='storageSize']")
print("Storage size: ", btn[1].get_attribute('value')) #prints 128
btn[1].click()

我可以打印出按钮的值,但是当我尝试点击它时,我得到:

ElementNotVisibleException: Message: element not visible
  (Session info: chrome=62.0.3202.75)
  (Driver info: chromedriver=2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73),platform=Windows NT 6.3.9600 x86_64)

1 个答案:

答案 0 :(得分:2)

因为按钮是CSS按钮。从您的HTML我们可以知道有一个Radio button,但是从页面按钮不像单选按钮,由于css改变了按钮的外观而使其不像单选按钮。

您是否注意到单选按钮旁边有一个Lable,要更改单选按钮的外观,CSS可以将标签放在顶部以通过css:index覆盖单选按钮。无论CSS如何做到这一点。你现在不能单击单选按钮,因为标签覆盖它,你必须点击Lable。

为什么你可以打印出按钮值,因为你按getAtttibute('value')获得按钮值,如果你的代码改为print("Storage size: ", btn[1].text),它将打印空字符串。

这就像Selenium Design:

  

如果某个元素从用户体验中看不到,Selenium将报告   单击它时ElementNotVisible,并在get时返回空字符串   它的文字内容。因为sendKeys(),click(),getText()将充当用户体验。

     

但getAttribute()不能充当用户体验,所以不关心元素是否可见,一旦Tag具有您想要的属性,就可以获得属性值。

如上所述,您应该点击标签,因此请将代码更改为

browser.find_element_by_xpath("//label[contains(.,'128GB')]").click();