美文网首页
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