新闻详情

新闻详情

首页 / 资讯中心 / 详情

XPath定位实战:从Appium到网页自动化,彻底搞懂元素定位

发布时间:2026/10/2 7:28:29来源:尧图网络
XPath定位实战:从Appium到网页自动化,彻底搞懂元素定位
做 UI 自动化测试的人大概率都有过这种时刻Appium Inspector 里明明能看到元素id、accessibility id 都摆在那儿脚本一跑还是超时。等真正把 xpath 搞明白之后你会发现很多卡住的问题其实都是没把元素放到文档树里去理解。这篇文章就是写给“刚认识 xpath”的同行不仅讲 xpath 是什么、怎么写还会把 Appium Inspector 拿元素信息、XPath Helper 这类调试工具、以及我踩过的一些坑一次性讲透。如果你正在做 Selenium、Playwright 或 Appium 自动化或者刚接触爬虫、对页面结构还不熟这篇会比较对你的胃口。我不会从 W3C 标准定义讲起而是按实际项目里的使用顺序来先搞懂本质再练语法再上手工具最后看真实排查案例。这样一套走下来xpath 在你心里就不再是玄学了。1. XPath 到底是什么——从一次定位失败说起1.1 定位不到元素的那一刻我才知道要学 XPath我最早接触自动化测试是从 Selenium 开始的当时会用的定位方式屈指可数id、name、class name加上 link text。那时候写脚本挺安逸因为测试系统是自家团队开发的id 规范得一塌糊涂。后来转到 App 测试接手一个第三方 AppAppium Inspector 一打开就傻眼了页面上十来个可点击元素其中六个 class 都是 android.widget.TextViewresource-id 要么没有要么是动态生成的乱码。text 看起来可用但同样的问题又来了——在不同登录状态下按钮上的文字会变。我印象特别深的是一个搜索页面。页面上有三个 EditText长得一模一样不带 idclass 全是 android.widget.EditText连 text 都没有默认值。用 Appium Inspector 自动生成 xpath 的话它会给出一个上十层的完整路径类似/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/.../android.widget.EditText[2]。这种表达式当场能跑但只要换机型、动布局就立刻作废。那时候我才意识到单纯背 Locator 类型没有意义关键是要能描述“元素在页面结构中的关系”。id 是标签class 是类别text 是内容这些都可能变、可能重名而元素之间的父子关系、兄弟关系、层级路径是相对稳定的信息。xpath 恰好就是干这个的它不依赖某个具体属性而是用一条路径表达式把元素在文档树中的位置说清楚。所以我把 xpath 的入门理解概括成一句话当你手里的定位“标签”全都不靠谱时xpath 就是那个帮你按地图找元素的方法。1.2 XPath 的本质用路径描述文档树中的位置XPath 全称 XML Path Language拆开看就很好懂XML 是文档格式HTML 是 XML 的一种具体应用移动端 Appium 拿到的页面源码也是类似的树形结构Path 是路径Language 是表达式。合起来XPath 就是一套给 XML/HTML 树上的节点“写地址”的语言。我比较喜欢用文件系统做类比。Windows 里的路径C:\Users\admin\Desktop\report.pdf意思是从 C 盘根目录出发依次进入 Users、admin、Desktop最后点文件名。XPath 里的绝对路径长得像 Linux 路径/html/body/div/div[2]/form/input也是从根节点开始一层层往下走。你在文件系统里可以写相对路径../images/logo.png表示从当前目录往上一层再进入 imagesXPath 里同样有..表示父节点、.表示当前节点。但 XPath 比文件路径更灵活因为它不只是一条“路线”还是一套检索语言你可以跳过中间层直接找后代也就是双斜杠//你可以用方括号加条件做筛选你可以按属性、文本、节点类型匹配甚至可以沿“轴”走动比如找当前节点的父节点、祖先节点、后面的兄弟节点。这东西刚学的时候觉得符号多但核心其实就两件事一是描述“在哪”二是描述“满足什么条件”。移动端也完全适用。Appium Inspector 拿到的 page source 就是一棵 XML 树每个控件是节点resource-id、text、content-desc 都是节点的属性。所以 xpath 在 App 自动化和 Web 自动化里都能用只是节点名称和属性名不同网页里是 div、span、id、classApp 里是 android.widget.TextView、resource-id、text。1.3 为什么 XPath 在自动化测试里绕不开因为工作里确实存在“只能用 xpath”的场景。我目前总结出四类。一是按文本找元素。CSS 选择器里没有“文本匹配”这种能力但页面上经常出现“确定”“取消”“我知道了”这类按钮没有 id、没有 nameclass 又是公共组件样式。这种时候//button[contains(text(),确定)]是最快的定位方式几乎没有替代品。二是根据相对关系找元素。比如点了某个图标后要验证某个文本区域出现或者要在某个商品卡片里找到它的价格标签。单看节点本身没有明确标识但它在结构上必然跟在某个稳定节点后面。xpath 的 following-sibling、ancestor、parent 这些轴就是为这类场景设计的。三是动态 id 的处理。页面升级后 id 变成item_1234、item_5678数字每次不同。用 xpath 的 starts-with 或 contains 可以按前缀做模糊匹配这在现代前端框架React、Vue渲染的页面里特别常见。四是读别人脚本时至少要能看懂。Selenium 老项目、Appium 老教程里大量使用 xpath你接手一个项目如果只会 id 定位看到满屏的//div[contains(...)]就会无从下手。当然xpath 也不是万能的它有性能劣势。移动端 Appium 里 xpath 解析比 id 定位慢一倍以上所以定位方式也分轻重缓急能用 id 就不硬上 xpath。但工具没有高低多一层手段就多一条活路。2. XPath 核心语法详解从绝对路径到相对路径2.1 绝对路径与相对路径两种写法的差异写 xpath 之前得先分清两个基础符号/和//。一个斜杠表示“从根节点开始逐层选择”两个斜杠表示“从任意位置开始跳过中间任意层级找符合要求的节点”。绝对路径/html/body/div/div[1]/form/input[idsearch]是从 html 根节点一路写下来中间的每一层都必须准确对应。它的优点是结构可靠缺点是极脆只要中间插入一层容器整条路径就作废。浏览器 DevTools 右键“Copy full path”生成的就是这种路径我一般只用来临时看一眼结构不会直接写进脚本。相对路径//input[idsearch]就从容很多。它不关心这个 input 在第几层只要页面里存在一个 id 等于 search 的 input 就能找到。很多同学一开始不理解为什么要加两个斜杠。我通常这样解释不用描述从小区大门走到几号楼再上几层你只问“整个城市里叫这个名字的店在哪”系统会自动把搜索范围撑到全页面。同理//表示“在整个文档范围里找”而不用一级一级写父节点。这里要注意//后面跟的选择条件越具体性能反而越好。移动端 Appium 最怕//*这种全节点通配遍历整棵 UI 树很慢我见过因为一个//*把定位时间拖到十几秒的用例。绝对路径和相对路径中间还会用到./表示当前节点下、../表示父节点这在写轴表达式应付复杂嵌套时很有用。拿个页面结构示意!-- 页面结构示意 -- div idapp div classcard span classname张三/span span classage28/span /div /div要拿“张三”可以写//span[classname]也可以写//div[classcard]/span[1]。同样一个元素表达方式很多区别在于稳定性不同。我选择表达式的标准很简单哪条路径依赖的“层级”更少、依赖的“属性”更稳就选哪条。2.2 常用节点选择与轴Axis实战xpath 里选择节点靠 node test标签名、*通配、text()、comment()、node()。属性用前缀文本用text()或string()。基础例子//div所有 div 节点//div[classcard]class 为 card 的 div//span[idname]/text()取该 span 的文本内容//*[classcard]任意标签、class 为 card 的节点轴Axis是我实际工作中用得比较多的一部分尤其 following-sibling、preceding-sibling、parent、ancestor。这些轴解决的核心问题是“我有 A 但我要 A 旁边的 B”。举个移动端例子个人中心顶部有一个“设置”图标和一个“帮助”按钮。图标资源 id 稳定但按钮没有 id。可以写//android.widget.ImageView[resource-idcom.app:id/ic_settings]/following-sibling::android.widget.TextView[1]意思很直白先定位到设置图标然后找它后面的第一个 TextView。反过来如果只有一个文本“设置”要找它父容器里的另一个节点//android.widget.TextView[text设置]/parent::android.widget.LinearLayout/android.widget.TextView[2]轴用起来语义清楚缺点是表达式长度会变长。我的习惯是能用属性就用属性属性解决不了再上轴轴解决不了才考虑用 index。还有 descendant 和 ancestor 两个轴也常用。descendant::相当于限定范围后的//比如//div[idmenu]/descendant::a[contains(text(),退出)]比全局//a[...]更收敛检索效率也更好。Web 端同样适用。比如一个商品列表每个商品卡片里有标题和价格标题 text 稳定、价格标签没有 id//div[classproduct-title and text()无线耳机]/following-sibling::div[classproduct-price]这类表达式看多了你就会发现xpath 不是在“背诵某一个元素”而是在描述“元素之间的邻里关系”理解这一点很多定位思路自然就打开了。2.3 谓词与通配符精确筛选元素的利器谓词就是方括号[]功能是筛选。它把“找节点”这个动作细化成“找满足条件的节点”。没有谓词xpath 只是走一条固定路线有了谓词xpath 才有了检索能力。我工作中高频使用的谓词写法//input[idusername]属性过滤//input[typetext and nameusername]多条件组合//button[contains(text(),登录)]文本模糊匹配//div[contains(id,product_)]动态 id 前缀匹配//div[classitem and not(style)]取没有 style 的 item注意and、or、not()这些逻辑词看起来不起眼但经常会用到。尤其遇到“这个元素有两个类名我只想匹配其中一个”时可以用contains(class, active)而不是classbtn active后者一旦类名顺序变化就废了。通配符也顺便提一下*是任意节点*是任意属性。调试阶段用*很爽比如//*[classprice]能让你快速知道这个 class 到底挂在什么标签上。但正式脚本里尽量少用因为检索成本高移动端尤其明显。索引是另一个容易踩坑的点。xpath 里的位置索引从 1 开始不是 0。如果你要选第 2 个 item正确写法是(//div[classitem])[2]外面那层括号不能少。很多人写成//div[classitem][2]意思完全不一样——前者是“所有 item 里的第二个”后者是“是 item 的子元素中的第二个 div”。这个括号问题我至少见过三个同事踩过值得单独记一下。到这里xpath 的基本语法已经够用了。你现在可以打开任意页面结构试着写几个表达式相对路径、contains、following-sibling、索引。不用追求一次写对重要的是开始用“树”的视角看页面。3. 自动化测试中的 XPath 实战Appium Inspector 与网页元素定位3.1 Appium Inspector一键获取 XPath、id、accessibility idAppium Inspector 是 Appium 官方的元素检查工具。它的界面逻辑很简单左侧是页面 XML 层级树中间是模拟器或真机的页面截图右侧是选中元素的属性面板。启动会话后页面结构会被解析成树你点左侧或中间某个元素右侧就能看到它的 class、resource-id、text、content-desc、bounds 等属性同时自动生成一个 xpath。这里必须提醒一句Appium Inspector 自动生成的 xpath 往往又长又脆因为它会把从根节点到目标节点的每一层都写出来类似这样/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.TextView[text个人中心]这种表达式实际能跑但只能在“当前这台设备和当前版本”下能用。换一个分辨率可能多一层换一个版本层级可能变化。所以我的经验是Inspector 的自动 xpath 只能当参考不能直接抄进测试脚本。真正要做的是看它把元素定位到的思路——比如这个元素的 text 是什么、它跟哪个稳定 id 离得近然后把表达式重写成短小的相对路径。Appium Inspector 更大的价值在于帮我们确认哪些属性是稳定的。如果 resource-id 稳定优先用 resource-id如果 content-desc也就是 accessibility id稳定优先用 accessibility id两者都不稳定再用 xpath 描述相对关系。这跟网页端的优先级逻辑是一致的。3.2 移动端元素定位id、accessibility id 和 XPath 怎么选很多新人拿到 Appium Inspector 都会问到底该用哪种定位方式我给出一个实战排序按稳定性、可读性、性能三个维度来看定位方式对应页面属性优点典型风险accessibility idAndroid content-desc / iOS accessibilityIdentifier语义化强、跨平台统一很多控件没有设置拿不到idAndroid resource-id / iOS 一般无对应性能好、脚本可读性高动态 id、版本升级后频繁变化xpath任意属性组合通用性强、能按文本/层级定位性能较慢、表达式可读性差在 Appium 里能点到的元素先用 accessibility id 或 resource-id如果有原生选择器Android UiSelector、iOS predicate string则优先级更高xpath 作为最后一招。不过我也要补充一个现实情况跨平台自动化项目里iOS 和 Android 的 id 体系完全不同写两套定位脚本维护成本很高。用 xpath 统一在某些业务场景下反而可行只要你不介意性能损耗。这也是为什么 Appium Inspector 必须支持 xpath 输出——不是因为它最好用而是因为它通用。实际写法给几个例子// Android resource-id driver.findElement(By.xpath(//android.widget.TextView[resource-idcom.example:id/tv_title])); // 按文本精确匹配 driver.findElement(By.xpath(//android.widget.TextView[text设置])); // 按文本模糊匹配 driver.findElement(By.xpath(//android.widget.TextView[contains(text,设置)]));文本精确匹配对中英文、空格、换行很敏感。App 里 text 经常会带一些不可见字符所以我通常用contains(text, ...)而不是text...这一个小习惯帮我少踩了很多坑。3.3 XPath Helper 插件浏览器端 XPath 调试神器网页自动化里我常用的调试工具不是 DevTools 的 Copy XPath而是 XPath Helper。这是 Thomas de Roo 写的老牌 Chrome 扩展功能非常简单直接打开网页后按快捷键 CtrlShiftX鼠标在页面上移动插件会实时计算出当前鼠标下元素的 xpath并显示在顶部浮动面板里高亮区域就是匹配到的元素你可以直接在面板里改表达式页面上的高亮会即时更新。这个实时验证能力非常有用。Selenium 脚本跑一次要起浏览器如果表达式写错了光是启停浏览器就浪费好几分钟。用 XPath Helper 一分钟能验证十个表达式效率差一大截。具体使用流程不复杂安装后打开目标页面按快捷键鼠标指向目标元素面板里出现 xpath 后你直接改比如把绝对路径改短、加条件页面会同步高亮。等表达式能准确高亮且只高亮一个元素再把它粘到代码里。这里有个小规律高亮的元素个数体现的是表达式“宽不宽”。如果一次高亮了一片元素说明你的表达式太宽泛需要加条件收窄如果只高亮正确元素那基本就是有效表达式。不过 XPath Helper 自动生成的 xpath 同样又长又丑我的习惯是只利用它的实时高亮当调试器表达式还是自己写。工具是用来辅助验证的不是用来替代思考的。3.4 Chrome 应用商店无法访问时XPath Helper 的替代安装方式很多人卡在第一步Chrome 应用商店打不开XPath Helper 装不上。这个问题的背景很现实Chrome 应用商店在一些网络环境下确实访问不稳定。我不展开网络层面的因素直接给你三条能落地、合规的替代路径。第一条换 Edge 浏览器。Edge 的内核跟 Chrome 一样是 Chromium扩展基本通用而 Edge 扩展商店在多数网络环境下可正常访问。打开微软 Edge 加载项商店搜索“XPath Helper”找到同名扩展直接安装即可。Edge 里使用方式跟 Chrome 完全一致快捷键也是 CtrlShiftX。第二条手动加载源码包。XPath Helper 有 GitHub 开源仓库搜索 xpath-helper 就能找到。把源码 clone 下来在浏览器扩展页面打开“开发者模式”点“加载已解压的扩展程序”选中仓库文件夹即可。这个方法对网络环境几乎没要求很适合离线安装也适合想研究插件实现的人。第三条换同类工具。ChroPath 支持 Chrome 和 Edge功能和 XPath Helper 类似还带生成 CSS Selector 的能力XPath Finder 更轻量Ranorex Selocity 也是不错的调试扩展。这些从扩展商店搜名字就能装。如果这些都不想装用 Chrome 自带的 DevTools 也完全够用Elements 面板里右键元素选择 Copy → Copy XPath 或 Copy full path就能拿到 xpath在 Console 里还可以用document.evaluate验证表达式。这些方法不依赖任何第三方扩展对我来说是最稳定的保底方案。一句话总结工具是为了省时间不是目的。Chrome 商店访问不了就换 Edge、换 GitHub、换 DevTools反正验证 xpath 的方法不止一种。4. 常见问题与排查技巧实录4.1 常见问题速查表先把我遇到的高频问题整理成速查表方便你直接对着查现象可能原因处理方式NoSuchElementException / 定位超时页面未加载完成、元素在 iframe 或 WebView 中显式等待切换 frame / context 后重定位xpath 语法报错 invalid selector引号嵌套错误属性值本身含引号外层用单引号内层用双引号或反过来表达式能匹配多个元素条件过宽缺少唯一属性加父节点锚点、兄弟轴或使用索引收窄页面一更新就定位不到用了过深的绝对路径改为相对路径 稳定属性锚点Appium 中 xpath 找不到但手点能点上下文还在原生 view元素在 WebView 里用 driver.context 切换到 WEBVIEW再重新定位文本里有空格或特殊字符text() 或 text 精确匹配失败用 contains(text,...) 或 normalize-space() 处理这几个问题的出现频率极高。其中“引号嵌套错误”几乎是新人必踩xpath 本身用引号包裹属性值如果属性值里还要用引号就会冲突。我的处理办法是外层用单引号、内层用双引号例如//button[contains(class, btn)]。如果遇到更复杂的值比如属性值本身又有单引号又有双引号就用 concat() 函数拼接。“表达式能匹配多个元素”这个也常见。很多人以为报错才会暴露问题但更隐蔽的是表达式其实匹配到了多个元素代码只取了第一个偶尔能用、偶尔不行。所以我在写定位时有一个习惯——写完表达式后用工具验证匹配个数超过 1 个就主动收窄而不是碰运气。4.2 动态页面下的 XPath 优化策略动态页面主要体现为三类id 会变、元素会延迟渲染、列表内容会刷新。针对这些我整理了几条实操策略。策略一找稳定的锚点。把页面结构看成一棵树总有节点是稳定的固定的容器 id、固定的按钮文本、固定的 resource-id。xpath 表达式应该是“锚点 少量相对关系”的组合而不是从根节点一路写到底。比如要定位某个未知 id 的输入框可以先找离它最近的、带稳定 id 的 label//label[forusername]/following-sibling::input这个写法不关心 input 自己的 id 是什么只依赖 label 和它在结构上的位置。策略二用 contains 和 starts-with 处理可变 id。比如某商品卡片 id 是product_123下次打开变成product_456那么//div[contains(id,product_)]就能稳定命中。如果 id 前缀稳定后缀会变用starts-with(id,product_)如果后缀稳定可以使用ends-with但注意老浏览器支持度一般。策略三少用直接 index多用位置关系。列表页里第 N 个元素直接用(//div[classitem])[3]其实很脆排序一变就废。更好的写法是看这个元素周围有没有稳定邻居比如某个商品标题是固定的就可以用标题节点做锚点再找同类节点。策略四组合 and 收紧范围。比如//button[contains(class,btn) and contains(text(),提交)]比单独一个条件收敛得多也能避开页面上其他“提交”按钮。策略五主动等待而不是靠碰运气。xpath 找不到元素很多时候不是表达式错了而是元素还没渲染。显式等待配合 xpath 定位比固定 sleep 更可靠也比硬改表达式更有效。判断到底是没渲染还是定位写错方法是把 wait 时间拉长试一次如果拉长时间就能找到那是时序问题如果仍然找不到才需要回头看表达式。4.3 我的排查心得从报错到稳定定位的过程讲一个具体案例。有一次我维护一个 App 的自动化用例首页有五个 Tab 菜单首页、发现、消息、购物车、我的。在 Appium Inspector 里看每个 Tab 都是 android.widget.TextViewresource-id 全是com.example:id/tab_item只有 text 不同。我一开始写的定位是//android.widget.TextView[text我的]结果跑了两次就报错因为某个版本里这个 Tab 的文字变成了“我的(3)”——角标数量不一样。改成 contains 后问题解决//android.widget.TextView[contains(text,我的)]后来另一个用例更考验人进入商品详情页页面上有多个“加入购物车”按钮各自在不同商品卡片里。元素本身有相同的 text 和相同的 class直接按文本定位会匹配到一堆。于是我换了个思路先找商品标题的稳定节点再用轴结构定位按钮//android.widget.TextView[text无线耳机]/ancestor::android.widget.LinearLayout[1]//android.widget.Button[contains(text,加入购物车)]这时我不再纠结按钮本身而是通过“它所在卡片里有一个标题叫无线耳机”这个相对关系来找。xpath 的灵活度在这种场景里体现得很充分同时也说明了为什么只会复制 Inspector 自动生成的 xpath 不够用。这段经历之后我给自己定了两个规矩。第一不在代码里直接粘贴 Inspector 生成的长路径至少要先精简一遍第二xpath 写完之后用工具验证一次匹配个数尽量让表达式收窄到唯一元素。这两个规矩帮我避开了大量无效调试也让脚本的生命周期变长了很多。最后分享一个我个人的体会。xpath 不难符号就那么几个真正拉开差距的是你愿不愿意在报错的时候把页面当一棵树去看。我现在遇到定位问题第一件事不是改代码再跑而是先打开 page source 或者元素面板把层级结构梳理一遍找稳定的锚点。这个习惯帮我省掉了大量试错时间。如果你刚开始学不用贪多先把相对路径、contains、following-sibling 这三个点练熟日常八成的元素都能搞定。剩下的等你踩到更复杂的坑时自然会回头查轴和谓词——到那时候你已经不是初识 xpath 了。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

FormData多文件上传的底层原理与实战避坑指南 2026/10/2 10:32:39

FormData多文件上传的底层原理与实战避坑指南

1. 这不是“加几个字段”那么简单&#xff1a;FormData多文件上传的真实复杂度你可能已经试过用new FormData()把几个<input type"file" multiple>选中的文件塞进去&#xff0c;再append(username, zhangsan)加个用户名&#xff0c;最后fetch(/upload, { metho…

阅读更多 →
WorkBuddy 深度解析:AI Agent 工作台从安装配置到 Skill 实战 2026/10/2 10:32:39

WorkBuddy 深度解析:AI Agent 工作台从安装配置到 Skill 实战

1. 为什么我劝你先搞清楚 WorkBuddy 到底是个什么东西第一次打开 WorkBuddy 的时候&#xff0c;我承认我有点懵。界面上东西不多&#xff0c;一个对话框&#xff0c;左边一排图标&#xff0c;看起来跟市面上那些聊天工具没什么本质区别。但真正用起来才发现&#xff0c;这东西的…

阅读更多 →
Jetpack Compose 预览完全指南:从原理到最佳实践 2026/10/2 10:32:39

Jetpack Compose 预览完全指南:从原理到最佳实践

看到“Compose 预览”这个需求&#xff0c;先别急着往 Docker Compose 上想&#xff0c;在 Android 开发这个语境里&#xff0c;它指的是 Jetpack Compose 的 UI 预览能力。简单说&#xff0c;就是不用跑模拟器、不用连真机&#xff0c;直接在 Android Studio 里把 Composable …

阅读更多 →
YOLOv8改进算法实战:垃圾分类识别全流程解析 2026/10/2 10:32:38

YOLOv8改进算法实战:垃圾分类识别全流程解析

这个选题我太熟了&#xff0c;垃圾分类识别在目标检测里属于典型的“工业界急用、学术界能做文章”的方向。标题里三个关键词——深度学习、YOLOv8、改进算法——基本就框死了技术路线和实现方案。我按自己做过的类似项目经验&#xff0c;把这个课题从思路拆解到部署落地完整捋…

阅读更多 →
FormData多文件上传原理与实战:HTTP multipart协议深度解析 2026/10/2 10:32:38

FormData多文件上传原理与实战:HTTP multipart协议深度解析

1. 这不是“加几个文件”那么简单&#xff1a;FormData多文件上传的本质是数据组织方式的重构你有没有遇到过这样的场景&#xff1a;前端要提交一个带封面图、多张产品图、PDF说明书&#xff0c;还要附带商品名称、分类ID、是否上架、创建人邮箱——这四个字段里&#xff0c;三…

阅读更多 →
ModelSim vsim-3033模块未定义排查:库映射与编译顺序 2026/10/2 10:32:24

ModelSim vsim-3033模块未定义排查:库映射与编译顺序

很多人在跑 ModelSim 仿真时都遇到过这样一行提示&#xff1a;Error: (vsim-3033) ... Instantiation of xxx failed. The design unit was not found.&#xff0c;或者更直接一点的Module XXXX is not defined。第一次看到它的人往往会先去怀疑代码语法&#xff0c;把对应的 .…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉