【问题标题】:Getting specific elements in selenium获取硒中的特定元素
【发布时间】:2021-01-12 00:58:15
【问题描述】:

我正在尝试让元素在下图中显示为 N06D-X N07X R01A-C01 S01G-X01:

现在,我通过这种方式得到了类似 WebDriver 的东西:

who = driver.find_element_by_tag_name("span").find_elements_by_tag_name("p")

得到这样的输出:

[<selenium.webdriver.remote.webelement.WebElement (session="1c044455cf883fdedf6845bcd456bfab", element="0.23338884730774767-2")>]

我在 Mac Catalina 上工作,当我输入: who.text 时,由于某种原因它返回一个空列表。我遇到了与 Bs 非常相似的问题,但我用.string 而不是.text 解决了它们。这里 .string 不适用于 WebDriver 元素。

问题是:我怎样才能用硒获得N06D等物品?

【问题讨论】:

    标签: python selenium xpath css-selectors webdriverwait


    【解决方案1】:

    看来你已经够近了。

    [<selenium.webdriver.remote.webelement.WebElement (session="1c044455cf883fdedf6845bcd456bfab", element="0.23338884730774767-2")>]
    

    表示当您在元素中查找文本时所在的元素。

    提取文本,例如N06D-XN07X 等来自使用 Selenium 的所有 &lt;p&gt; 标签,你必须为 visibility_of_all_elements_located() 诱导 WebDriverWait 和你可以使用以下任一Locator Strategies

    • 使用CSS_SELECTORget_attribute("innerHTML")

      print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "li.data-list__property#who-atc-codes span.data-list__property-value p")))])
      
    • 使用XPATHtext属性:

      print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//li[@class='data-list__property' and @id='who-atc-codes']//span[@class='data-list__property-value']//p")))])
      
    • 注意:您必须添加以下导入:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      

    结尾

    链接到有用的文档:

    【讨论】:

    • 谢谢大家。 @DebanjanB EC.visibility_of_all_elements_located() 做什么?我的意思是它是如何工作的?它实际上似乎是一个非常有用的工具。您似乎要求等待 20 秒,直到 EC 中的条件。匹配
    • visibility_of_all_elements_located() 是与WebDriverWait 一起使用的expected_conditions,它会停止执行WebDriver,直到元素被显示并且高度和宽度也大于0。跨度>
    【解决方案2】:

    您不是在整个网站中搜索,而是在以前找到的对象中搜索

    li_object = driver.find_elements_by_id('who-atc-codes')
    lst = li_object.find_element_by_tag_name("span").find_elements_by_tag_name("p")
    
    for p in lst:
        print(p.text)
        print(p.get_attribute('innerHTML'))
    

    或者你可以试试

    span_object = li_object.find_element_by_tag_name("span")
    print(span_object.get_attribute('innerHTML'))
    

    【讨论】:

    • 好的。但是现在我怎样才能得到 .text 然后是里面的所有元素(即 N06D 等等)?也许 li_object[0].get_attribute("innerHTML")?但是那我怎样才能得到N06D等等呢?可能是这样的: for i in range(len(who)): print(who[i].get_attribute("innerHTML")) ?
    【解决方案3】:

    使用以下css selector 获取项目列表,然后进行迭代。

    要获取文本,您可以使用 .text.get_attribute("innterHTML").get_attribute("textContent")

    代码:

    items=driver.find_elements_by_css_selector("span.data-list__property-value>p")
    for item in items:
        print(item.text)
        print(item.get_attribute("innterHTML"))
        print(item.get_attribute("textContent"))
        #To get only value from string use spilt and take the first element.
        print(item.text.strip().split(" ")[0])
        print(item.get_attribute("innterHTML").strip().split(" ")[0])
        print(item.get_attribute("textContent").strip().split(" ")[0])
    

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      相关资源
      最近更新 更多