如何使用Selenium从父元素具有属性style =“display:none”的元素中提取文本

时间:2018-06-07 21:12:05

标签: python selenium selenium-webdriver

This Image Shows my Html Source

我想从这个div中提取电话号码。这个div有style =“display:none” 所以我无法访问这个div的孩子。请帮助我从div获取电话号码。

我想我们需要改变那个显示:无;能见度:可见。我怎么能在Python Selenuim中做到这一点

修改

我已尝试过以下代码,如第一个答案所示,但它会引发以下错误:

email_div = browser.find_element_by_class_name("returnemail")
email_div_contents = browser.execute_script('return arguments[0].innerHTML', email_div)
telephone = email_div_contents.find_element_by_class_name('reply-tel-number').get_attribute('textContent')
  

AttributeError:'str'对象没有属性   “find_element_by_class_name

2 个答案:

答案 0 :(得分:-1)

根据文档execute_script()返回:

  

将命令的JSON响应加载到字典对象中。

因此,当您尝试在字典对象上调用find_element_by_class_name()方法时向前移动,如下所示:

email_div_contents.find_element_by_class_name('reply-tel-number').get_attribute('textContent')

引发以下错误:

  

属性错误:' str'对象没有属性' find_element_by_class_name'

要从所需元素中删除属性 style =&#34; display:none&#34; 并提取电话号码,您可以使用以下解决方案:< / p>

element = driver.find_element_by_xpath("//div[@class='returnemail js-only']")
driver.execute_script("arguments[0].removeAttribute('style')", element)
tel_number = element.find_element_by_xpath("./aside/ul//li//p[@class='reply-tel-number']").get_attribute("innerHTML")

答案 1 :(得分:-2)

您的代码地址不正确:

email_div = browser.find_element_by_class_name("returnemail")
email_div_contents = browser.execute_script('return arguments[0].innerHTML', email_div)
email_div_contents.find_element_by_class_name()

email_div_contents是一个字符串,代表email_div的HTML代码,而不是网络元素,  您无法在字符串上调用find_element_by_class_name()

这就是你遇到错误的原因:

  

&#39; STR&#39;对象没有属性&#39; find_element_by_class_name&#39;

您始终可以调用get_attribute()来获取可见和不可见元素的属性值。

要获取不可见元素的文本内容,您可以使用get_attribute('innerText')

phone_number = driver.find_element_by_css_selector("div.returnemail .reply-tel-number")
                     .get_attribute('innerText')

实际上,element.text在内部调用element.get_attribute('innerText'),但element.text会尊重用户体验:如果用户无法从页面中看到该元素,element.text将返回空用户看到的字符串。 (偶数element.get_attribute('innerText')返回非空字符串)

   @property
   text:
     if ( element is visible ):
        return element.get_attribute('innerText')

     else:
        return ''