【问题标题】:how to identify css selector ::before in selenium is not working如何识别 css 选择器 ::before 在 selenium 中不起作用
【发布时间】:2020-03-12 09:50:48
【问题描述】:

我正在尝试使用 Selenium 获取列表中的所有元素 ::before 伪元素。我无法将数据保存到列表中。

场景:我想把所有的数据放到列表里的数据里和一个标签里

这是 DOM 的样子:

我正在使用 selenium + python

此代码悬停在主类别导航“女性”:

element_to_select = driver.find_element_by_xpath("//*[@id='nico-main-header']/nav/ul/li[1]")
hover = ActionChains(driver).move_to_element(element_to_select)
hover.perform()
driver.implicitly_wait(15)

打印所有 li achor 标签:

ele = driver.find_element_by_css_selector("ul .row .col-md-3:first-child ul li")

print(ele)

** 但是打印 ele 时没有出现 li 锚标记。

【问题讨论】:

  • 能否请您发布您已经尝试过的代码?
  • 这段代码被放到主类别导航: element_to_select = driver.find_element_by_xpath("//*[@id='nico-main-header']/nav/ul/li[1]") hover = ActionChains(driver).move_to_element(element_to_select) hover.perform() driver.implicitly_wait(15) 打印所有 li achor 标签:ele = driver.find_element_by_css_selector("ul .row .col-md-3:first-child ul li ") 打印(ele)
  • 请将 selenium 代码发布到您尝试使用 java、python 或 javascript 的任何编程语言中。
  • 标签: python selenium xpath css-selectors


    【解决方案1】:

    您可以使用以下代码: 对于标签

    my_a_tag_datas = []      //empty list
    a_data = driver.find_elements_by_tag_name("a")   //a tag from web driver
    for a_tag_data in a_data:      
        a_tag_data_taxt = a_tag_data.text    // a tag element data convert to text
        my_a_tag_datas.append(a_tag_data_taxt)   //  a tag whole data save in list
    print(my_a_tag_datas)    // print list data
    

    对于 li 标签:相同的代码只需将“a”替换为“li”

    注意:如果您保存所有元素而不是文本,请在我附加 a_tag_data_taxt 的地方附加 a_tag_data

    【讨论】:

    • 运行代码时无法正常工作。仅打印女性字符串,所有数据为空。
    【解决方案2】:

    免责声明:这不是最佳解决方案。我是第一次使用 python,对 selenium 的操作不多。

    elem = driver.find_element_by_css_selector('.col-md-3').find_elements_by_tag_name('a')
    
      for a_tag_data in elem:
        a_tag_data_text = a_tag_data.text
        my_a_tag_datas = my_a_tag_datas + a_tag_data_text
    
    print(my_a_tag_datas)
    

    【讨论】:

      【解决方案3】:

      Pseudo Elements

      CSS pseudo-element 用于设置元素的指定部分的样式。它可以用于:

      • 为元素的第一个字母或行设置样式
      • 在元素内容之前或之后插入内容

      ::之前

      ::before 在 HTML 中的任何其他内容之前而不是之后插入内容。使用其中一个的唯一原因是:

      • 您希望生成的内容在位置上位于元素内容之前。
      • ::after 内容在源顺序中也位于“之后”,因此如果自然堆叠,它将位于::before 之上。

      这个用例

      要使用SeleniumPython 提取<a> 标记中的所有文本,您必须为visibility_of_all_elements_located() 引入WebDriverWait,您可以使用其中任何一个关注Locator Strategies

      • 使用CSS_SELECTOR

        driver.get("https://nthqibord.com/2019/08/15/pemimpin-pkr-pertahan-tun-mahathir/")
        print([my_elem.text for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "a#main-category-menu[href='/shop/women/'] + ul.top-nav-border ul li>a")))])
        
      • 使用XPATH:

        driver.get("https://nthqibord.com/2019/08/15/pemimpin-pkr-pertahan-tun-mahathir/")
        print([my_elem.text for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//a[@id='main-category-menu' and @href='/shop/women/']//following::ul[@class='top-nav-border']//ul//li/a")))])
        
      • 注意:您必须添加以下导入:

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

      【讨论】:

      • 不工作即将出现错误,TypeError: __init__() 接受 2 个位置参数,但给出了 3 个
      猜你喜欢
      相关资源
      最近更新 更多
      热门标签