笔记1-- UI 元素定位

一、元素定位

1、如果元素定位不到,可能的原因如下:

  1. 元素没有加载完成
  2. 元素在Frame中
  3. 元素不可用,不可读或不可见
  4. 元素有动态属性,在动态DIV中

2、元素定位的方法:8种

id, name, class_name, xpath, css, tag_name, link_text, partial_link_text

id 定位:

driver.find_element(By.ID,"kw")

name 定位:

driver.find_element(By.NAME,"wd")
driver.find_element(By.LINK_TEXT,"新闻").click()
driver.find_element(By.LINK_TEXT,"新").click()

xpath 定位:

绝对路劲:/ 开头 --> /html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input

相对路劲://开头 --> //*[@id="kw"]

  1. 相对路劲+索引定位

    driver.find_element(By.XPATH,"//form/span[1]/input").send_keys("逆流的鱼2016")
    
  2. 相对路劲+属性定位

    # autocomplete='off'是input标签种唯一的属性
    driver.find_element(By.XPATH,"//input[autocomplete='off']").send_keys("逆流的鱼2016")
    
  3. 相对路劲+通配符定位

    #通配符*后使用id属性,实际还是使用ID来定位
    driver.find_element(By.XPATH,"//*[@id='kw']").send_keys("逆流的鱼2016")
    
  4. 相对路劲+部分属性值定位

    # 以某字符开头的属性,在F12窗口下搜索元素//*[starts-with(@autocomplete,"of")]
    driver.find_element(By.XPATH, "//*[starts-with(@autocomplete,'of')]").send_keys("逆流的鱼2016")
    #结尾包含某字符
    driver.find_element(By.XPATH, "//*[substring(@autocomplete,2)='ff']").send_keys("逆流的鱼2016")
    #包含关键字符
    driver.find_element(By.XPATH, "//*[contains(@autocomplete,'ff')]").send_keys("逆流的鱼2016")
    
  5. 相对路劲+文本定位

#定位到元素,然后获取属性
attr = driver.find_element(By.XPATH, "//span[text()='按图片搜索']").get_attribute("class")

css 定位:

  1. 绝对路劲:弃用

    driver.find_element(By.CSS_SELECTOR, "html body div div div div div form span input").send_keys("逆流的鱼2016")
    #或
    driver.find_element(By.CSS_SELECTOR, "html>body>div>div>div>div>div>form>span>input").send_keys("逆流的鱼2016")
    
  2. 通过ID 定位

    driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("逆流的鱼2016")
    
  3. 通过class定位

    driver.find_element(By.CSS_SELECTOR, ".s_ipt").send_keys("逆流的鱼2016")
    
  4. 通过其他属性定位 [属性名=“属性值”]

    #单个属性
    driver.find_element(By.CSS_SELECTOR, "[autocomplete='off']").send_keys("逆流的鱼2016")
    #多个属性
    driver.find_element(By.CSS_SELECTOR, "[autocomplete='off'][name='wd']").send_keys("逆流的鱼2016")
    
  5. 通过部分属性定位 [属性名=“属性值”]
    匹配符号: * 包含某个字符
    ^ 以什么开头
    $ 以什么结尾

    #属性值包含of
    driver.find_element(By.CSS_SELECTOR, "[autocomplete*='of']").send_keys("逆流的鱼2016")
    #属性值以of开头
    driver.find_element(By.CSS_SELECTOR, "[autocomplete^='of']").send_keys("逆流的鱼2016")
    #属性值以ff结尾
    driver.find_element(By.CSS_SELECTOR, "[autocomplete$='ff']").send_keys("逆流的鱼2016")
    
  6. 查询子元素(层级)定位,一般会跟id,class或属性定位一起配合使用
    上下级符号:> 或 空格

    #纯层级
    driver.find_element(By.CSS_SELECTOR, "form>span>input").send_keys("逆流的鱼2016")
    #跟id组合
    driver.find_element(By.CSS_SELECTOR, "form#form>span>input").send_keys("逆流的鱼2016")
    
  7. 查询兄弟节点定位
    兄弟节点:同一父级标签,下面有多个相同标签的元素,那么这些元素就是兄弟节点
    第一个节点:first-child
    第二~N: nth-child(n) n是元素序号
    最后一个: last-child

#div作为父级,id=s-top-left,底下有多个a标签
driver.find_element(By.CSS_SELECTOR, "div#s-top-left a:first-child").click()
#打开第三个标签
driver.find_element(By.CSS_SELECTOR, "div#s-top-left a:nth-child(3)").click()
#打开最后一个标签,这个python3.9以上版本不太好使
driver.find_element(By.CSS_SELECTOR, "div#s-top-left  a:last-child")
posted @ 2023-08-25 08:35  逆流的鱼2016  阅读(20)  评论(0编辑  收藏  举报