美文网首页
Selenium/JS 全部定位方式实现和分析

Selenium/JS 全部定位方式实现和分析

作者: 假程序员 | 来源:发表于2019-05-08 01:27 被阅读0次

ide:pycharm
language:python 2.7
selenium:3.141.0

# coding=utf-8
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.chrome.options import Options

'''
// 在python的selenium中,ID,TAG_NAME,CLASS_NAME,NAME这四种最终都转为了css定位
class WebDriver(object):
    def find_element(self, by=By.ID, value=None):
        if self.w3c:
            if by == By.ID:
                by = By.CSS_SELECTOR
                value = '[id="%s"]' % value
            elif by == By.TAG_NAME:
                by = By.CSS_SELECTOR
            elif by == By.CLASS_NAME:
                by = By.CSS_SELECTOR
                value = ".%s" % value
            elif by == By.NAME:
                by = By.CSS_SELECTOR
                value = '[name="%s"]' % value
    ...
'''

if __name__ == '__main__':
    options = Options()
    options.add_argument("--incognito")
    path = "/Users/apple/Seleniumdriver/chromedriver"
    driver = WebDriver(options=options,
                       service_log_path="log.txt")
    driver.get("https://www.baidu.com")

    # 下面是八种基本定位方法
    # 1 id定位
    selenium_id = driver.find_element_by_id("su")  # selenium方式 by.id
    js_id = driver.execute_script('return document.getElementById("su")')  # js方式 document.getElementById("su")
    if selenium_id != js_id:
        assert False

    # 2 name定位
    selenium_name = driver.find_element_by_name("tj_trhao123")  # selenium方式 by.name
    js_name = driver.execute_script(
        'return document.getElementsByName("tj_trhao123")[0]')  # js方式 document.getElementsByName("tj_trhao123")[0]
    if selenium_name != js_name:
        assert False

    # 3 classname定位
    selenium_class_name = driver.find_element_by_class_name("s_ipt")  # selenium方式 by.classname
    js_class_name = driver.execute_script(
        'return document.getElementsByClassName("s_ipt")[0]')  # js方式 document.getElementsByClassName("s_ipt")[0]
    if selenium_class_name != js_class_name:
        assert False

    # 4 tag_name 定位
    selenium_tag_name = driver.find_element_by_tag_name("body")  # selenium方式 by.tag_name
    js_tag_name = driver.execute_script(
        'return document.getElementsByTagName("body")[0]')  # js方式 document.getElementsByTagName("body")[0]
    if selenium_tag_name != js_tag_name:
        assert False

    # 5 link_text定位
    selenium_link_text = driver.find_element_by_link_text("hao123")  # selenium方式 by.link_text
    # 无js的link_text定位方法

    # 6 partial_link_text定位
    driver.find_element_by_partial_link_text("hao")  # selenium方式 by.partial_link_text
    # 无js的partial_link_text定位方法

    # 7 css定位
    selenium_css = driver.find_element_by_css_selector("#kw")  # selenium方式 by.css
    js_css = driver.execute_script('return document.querySelector("#kw")')  # js方式 document.querySelector("#kw")
    if selenium_css != js_css:
        assert False

    selenium_css = driver.find_element_by_css_selector(".s_ipt")
    js_css = driver.execute_script('return document.querySelector(".s_ipt")')  # js方式 document.querySelector(".s_ipt")
    if selenium_css != js_css:
        assert False

    selenium_css = driver.find_element_by_css_selector("span>input")  # d
    js_css = driver.execute_script(
        'return document.querySelector("span>input")')  # js方式 document.querySelector("span>input")
    if selenium_css != js_css:
        assert False

    # 8 xpath定位
    selenium_xpath = driver.find_element_by_xpath(
        "//input[@maxlength='255']")  # document.evaluate("//input[@maxlength='255']", document).iterateNext()
    js_xpath_1 = driver.execute_script(
        'return document.evaluate("//input[@maxlength=\'255\']", document).iterateNext()')
    js_xpath_2 = driver.execute_script(
        'return document.evaluate("//input[@maxlength=\'255\']", '
        'document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0)')
    if selenium_xpath != js_xpath_1 or selenium_xpath != js_xpath_2:
        assert False

    # 下面是复数定位方法
    driver.find_elements_by_id("su")  # 该方法无实际意义,标准html中不允许存在id相同的两个元素

    if driver.find_elements_by_name("tj_trhao123") != driver.execute_script(
            'return document.getElementsByName("tj_trhao123")'):
        assert False

    if driver.find_elements_by_class_name("s_ipt") != driver.execute_script(
            'return document.getElementsByClassName("s_ipt")'):
        assert False

    driver.find_elements_by_tag_name("body")

    driver.find_elements_by_link_text("hao123")

    driver.find_elements_by_partial_link_text("hao")

    if driver.find_elements_by_css_selector("#kw") != driver.execute_script('return document.querySelectorAll("#kw")'):
        assert False
    if driver.find_elements_by_css_selector(".s_ipt") != driver.execute_script(
            'return document.querySelectorAll(".s_ipt")'):
        assert False
    if driver.find_elements_by_css_selector("span>input") != driver.execute_script(
            'return document.querySelectorAll("span>input")'):
        assert False

    # 这是用js写的一个xpath复数定位方法
    xpath = '''    
    function find_elements_by_xpath(path)
    {
        result = document.evaluate(path, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
        var i = 0
        var list = new Array()
        while (result.snapshotItem(i) != null)
        {
            list.push(result.snapshotItem(i++))
        }
        return list
    }
    return find_elements_by_xpath("//input[@maxlength='255']")
    '''

    if driver.find_elements_by_xpath("//input[@maxlength='255']") != driver.execute_script(xpath):
        assert False

    driver.close()
    driver.quit()

被简化的log.txt

[1557250080.306][INFO]: Starting ChromeDriver 74.0.3729.6
[1557250081.306][INFO]: Launching chrome: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
[1557250082.314][INFO]: resolved localhost to ["::1","127.0.0.1"]
[1557250082.554][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE InitSession {
}
[1557250082.556][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND Navigate {
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "url": "https://www.baidu.com"
}
[1557250083.153][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE Navigate
[1557250083.154][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElement { selenium id定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "id",
   "value": "su"
}
[1557250083.168][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElement {
   "ELEMENT": "0.885068976563621-1"
}
[1557250083.169][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND ExecuteScript {js id定位
   "args": [  ],
   "script": "return document.getElementById(\"su\")",
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d"
}
[1557250083.173][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE ExecuteScript {
   "ELEMENT": "0.885068976563621-1"
}
[1557250083.175][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElement {selenium name定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "name",
   "value": "tj_trhao123"
}
[1557250083.188][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElement {
   "ELEMENT": "0.885068976563621-2"
}
[1557250083.189][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND ExecuteScript {js name定位
   "args": [  ],
   "script": "return document.getElementsByName(\"tj_trhao123\")[0]",
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d"
}
[1557250083.194][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE ExecuteScript {
   "ELEMENT": "0.885068976563621-2"
}
[1557250083.195][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElement {selenium classname定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "class name",
   "value": "s_ipt"
}
[1557250083.205][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElement {
   "ELEMENT": "0.885068976563621-3"
}
[1557250083.206][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND ExecuteScript {js classname定位
   "args": [  ],
   "script": "return document.getElementsByClassName(\"s_ipt\")[0]",
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d"
}
[1557250083.209][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE ExecuteScript {
   "ELEMENT": "0.885068976563621-3"
}
[1557250083.210][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElement {selenium tagname定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "tag name",
   "value": "body"
}
[1557250083.220][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElement {
   "ELEMENT": "0.885068976563621-4"
}
[1557250083.221][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND ExecuteScript {js tagname定位
   "args": [  ],
   "script": "return document.getElementsByTagName(\"body\")[0]",
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d"
}
[1557250083.224][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE ExecuteScript {
   "ELEMENT": "0.885068976563621-4"
}
[1557250083.225][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElement {selenium linktext定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "link text",
   "value": "hao123"
}
[1557250083.240][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElement {
   "ELEMENT": "0.885068976563621-2"
}
[1557250083.241][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElement {selenium partiallinktext定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "partial link text",
   "value": "hao"
}
[1557250083.254][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElement {
   "ELEMENT": "0.885068976563621-2"
}
[1557250083.255][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElement {selenium css定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "css selector",
   "value": "#kw"
}
[1557250083.264][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElement {
   "ELEMENT": "0.885068976563621-3"
}
[1557250083.265][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND ExecuteScript {js css定位
   "args": [  ],
   "script": "return document.querySelector(\"#kw\")",
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d"
}
[1557250083.269][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE ExecuteScript {
   "ELEMENT": "0.885068976563621-3"
}
[1557250083.270][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElement {selenium css定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "css selector",
   "value": ".s_ipt"
}
[1557250083.282][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElement {
   "ELEMENT": "0.885068976563621-3"
}
[1557250083.283][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND ExecuteScript {js css定位
   "args": [  ],
   "script": "return document.querySelector(\".s_ipt\")",
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d"
}
[1557250083.286][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE ExecuteScript {
   "ELEMENT": "0.885068976563621-3"
}
[1557250083.287][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElement {selenium css定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "css selector",
   "value": "span>input"
}
[1557250083.297][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElement {
   "ELEMENT": "0.885068976563621-3"
}
[1557250083.298][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND ExecuteScript {js css定位
   "args": [  ],
   "script": "return document.querySelector(\"span>input\")",
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d"
}
[1557250083.302][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE ExecuteScript {
   "ELEMENT": "0.885068976563621-3"
}
[1557250083.303][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElement {selenium xpath定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "xpath",
   "value": "//input[@maxlength='255']"
}
[1557250083.313][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElement {
   "ELEMENT": "0.885068976563621-3"
}
[1557250083.314][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND ExecuteScript {js xpath定位
   "args": [  ],
   "script": "return document.evaluate(\"//input[@maxlength='255']\", document).iterateNext()",
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d"
}
[1557250083.318][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE ExecuteScript {
   "ELEMENT": "0.885068976563621-3"
}
[1557250083.319][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND ExecuteScript {js xpath定位
   "args": [  ],
   "script": "return document.evaluate(\"//input[@maxlength='255']\", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0)",
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d"
}
[1557250083.323][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE ExecuteScript {
   "ELEMENT": "0.885068976563621-3"
}
[1557250083.324][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElements {selenium 复数id定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "id",
   "value": "su"
}
[1557250083.333][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElements [ {
   "ELEMENT": "0.885068976563621-1"
} ]
[1557250083.334][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElements { selenium 复数name定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "name",
   "value": "tj_trhao123"
}
[1557250083.344][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElements [ {
   "ELEMENT": "0.885068976563621-2"
} ]
[1557250083.345][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND ExecuteScript {js name定位
   "args": [  ],
   "script": "return document.getElementsByName(\"tj_trhao123\")",
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d"
}
[1557250083.348][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE ExecuteScript [ {
   "ELEMENT": "0.885068976563621-2"
} ]
[1557250083.349][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElements {selenium 复数classname定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "class name",
   "value": "s_ipt"
}
[1557250083.358][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElements [ {
   "ELEMENT": "0.885068976563621-3"
} ]
[1557250083.359][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND ExecuteScript {js classname定位
   "args": [  ],
   "script": "return document.getElementsByClassName(\"s_ipt\")",
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d"
}
[1557250083.363][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE ExecuteScript [ {
   "ELEMENT": "0.885068976563621-3"
} ]
[1557250083.364][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElements {selenium 复数tagname定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "tag name",
   "value": "body"
}
[1557250083.375][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElements [ {
   "ELEMENT": "0.885068976563621-4"
} ]
[1557250083.376][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElements {selenium 复数 linktext定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "link text",
   "value": "hao123"
}
[1557250083.395][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElements [ {
   "ELEMENT": "0.885068976563621-2"
} ]
[1557250083.396][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElements {selenium 复数 partiallinktext定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "partial link text",
   "value": "hao"
}
[1557250083.412][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElements [ {
   "ELEMENT": "0.885068976563621-2"
} ]
[1557250083.413][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElements {selenium css复数定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "css selector",
   "value": "#kw"
}
[1557250083.422][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElements [ {
   "ELEMENT": "0.885068976563621-3"
} ]
[1557250083.423][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND ExecuteScript {js css复数定位
   "args": [  ],
   "script": "return document.querySelectorAll(\"#kw\")",
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d"
}
[1557250083.427][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE ExecuteScript [ {
   "ELEMENT": "0.885068976563621-3"
} ]
[1557250083.428][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElements {
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "css selector",
   "value": ".s_ipt"
}
[1557250083.437][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElements [ {
   "ELEMENT": "0.885068976563621-3"
} ]
[1557250083.438][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND ExecuteScript {
   "args": [  ],
   "script": "return document.querySelectorAll(\".s_ipt\")",
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d"
}
[1557250083.442][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE ExecuteScript [ {
   "ELEMENT": "0.885068976563621-3"
} ]
[1557250083.443][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElements {
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "css selector",
   "value": "span>input"
}
[1557250083.453][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElements [ {
   "ELEMENT": "0.885068976563621-3"
}, {
   "ELEMENT": "0.885068976563621-1"
} ]
[1557250083.454][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND ExecuteScript {
   "args": [  ],
   "script": "return document.querySelectorAll(\"span>input\")",
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d"
}
[1557250083.457][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE ExecuteScript [ {
   "ELEMENT": "0.885068976563621-3"
}, {
   "ELEMENT": "0.885068976563621-1"
} ]
[1557250083.459][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND FindElements {selenium xpath复数定位
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d",
   "using": "xpath",
   "value": "//input[@maxlength='255']"
}
[1557250083.469][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE FindElements [ {
   "ELEMENT": "0.885068976563621-3"
} ]
[1557250083.471][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND ExecuteScript { js xpath复数定位
   "args": [  ],
   "script": "    \n    function find_elements_by_xpath(path)\n    {\n        result = document.evaluate(path, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)\n        var i = 0\n        var list = new ...",
   "sessionId": "d0dc0f20a38d8c9d468334cf924c2f6d"
}
[1557250083.481][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE ExecuteScript [ {
   "ELEMENT": "0.885068976563621-3"
} ]
[1557250083.482][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] COMMAND CloseWindow {

}
[1557250083.617][INFO]: [d0dc0f20a38d8c9d468334cf924c2f6d] RESPONSE CloseWindow [  ]

以上代码在pycharm中调试通过。

相关文章

网友评论

      本文标题:Selenium/JS 全部定位方式实现和分析

      本文链接:https://www.haomeiwen.com/subject/enjsiqtx.html