<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Selenium Javascript教程 on 重定向学院</title><link>https://itest2025.pages.dev/categories/selenium-javascript%E6%95%99%E7%A8%8B/</link><description>Recent content in Selenium Javascript教程 on 重定向学院</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Tue, 17 Jun 2025 17:29:15 +0800</lastBuildDate><atom:link href="https://itest2025.pages.dev/categories/selenium-javascript%E6%95%99%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>（一）初始化环境</title><link>https://itest2025.pages.dev/tutorials/20-001-%E4%B8%80%E5%88%9D%E5%A7%8B%E5%8C%96%E7%8E%AF%E5%A2%83/</link><pubDate>Sun, 13 Aug 2017 05:24:16 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-001-%E4%B8%80%E5%88%9D%E5%A7%8B%E5%8C%96%E7%8E%AF%E5%A2%83/</guid><description>&lt;p>MacOS&lt;/p>
&lt;ul>
&lt;li>nodejs版本: 6.2.0&lt;/li>
&lt;li>selenium-webdriver版本: 3.4.0&lt;/li>
&lt;li>chrome版本: 版本 59.0.3071.86（正式版本）64位&lt;/li>
&lt;li>chrome driver版本: ChromeDriver 2.30.477690&lt;/li>
&lt;/ul>
&lt;p>Windows&lt;/p>
&lt;p>TODO&lt;/p>
&lt;h3 id="安装nodejs">安装nodejs&lt;/h3>
&lt;p>TODO&lt;/p>
&lt;h3 id="安装selenium-webdriver">安装selenium webdriver&lt;/h3>
&lt;pre tabindex="0">&lt;code>mkdir se
cd se
cnpm install selenium-webdriver

[selenium-webdriver@*] installed at node_modules/.npminstall/selenium-webdriver/3.4.0/selenium-webdriver (20 packages, use 4s, speed 447.48kB/s, json 34.34kB, tarball 1.54MB)

All packages installed (20 packages installed from npm registry, use 4s, speed 446kB/s, json 22(34.34kB), tarball 1.54MB)
&lt;/code>&lt;/pre>&lt;h3 id="安装chrome-driver">安装chrome driver&lt;/h3>
&lt;p>chrome driver建议通过科学上网的方式下载。&lt;/p>
&lt;p>&lt;a href="https://sites.google.com/a/chromium.org/chromedriver/downloads" target="_blank" rel="noopener noreffer ">下载地址&lt;/a>&lt;/p>
&lt;p>&lt;strong>下载完成后请将chromedriver.exe(windows)放到&lt;a href="http://jingyan.baidu.com/article/ed2a5d1f3655ca09f6be17a4.html" target="_blank" rel="noopener noreffer ">系统PATH&lt;/a>中&lt;/strong>&lt;/p>
&lt;p>验证chrome driver是否正确安装，请在命令行中输入&lt;/p>
&lt;pre tabindex="0">&lt;code>chromedriver -h
Usage: chromedriver [OPTIONS]

Options
 --port=PORT port to listen on
 --adb-port=PORT adb server port
 --log-path=FILE write server log to file instead of stderr, increases log level to INFO
 --verbose log verbosely
 --version print the version number and exit
 --silent log nothing
 --url-base base URL path prefix for commands, e.g. wd/url
 --port-server address of server to contact for reserving a port
 --whitelisted-ips comma-separated whitelist of remote IPv4 addresses which are allowed to connect to ChromeDriver
&lt;/code>&lt;/pre>&lt;p>如能看到上述结果则证明安装成功&lt;/p></description></item><item><title>（二）实战: 最简单的自动化脚本</title><link>https://itest2025.pages.dev/tutorials/20-002-%E4%BA%8C%E5%AE%9E%E6%88%98-%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8C%96%E8%84%9A%E6%9C%AC/</link><pubDate>Sat, 12 Aug 2017 08:26:17 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-002-%E4%BA%8C%E5%AE%9E%E6%88%98-%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8C%96%E8%84%9A%E6%9C%AC/</guid><description>&lt;h3 id="目的">目的&lt;/h3>
&lt;ul>
&lt;li>熟悉selenium webdriver 代码套路&lt;/li>
&lt;li>体验元素定位的最简单情形&lt;/li>
&lt;li>学会如何模拟输入键盘按键&lt;/li>
&lt;/ul>
&lt;h3 id="如何学习">如何学习&lt;/h3>
&lt;p>将代码抄一遍，然后精读一遍，了解每一行代码的意义。&lt;/p>
&lt;h3 id="场景">场景&lt;/h3>
&lt;p>本节我们需要使用selenium打开chrome浏览器，跳转到百度首页(&lt;a href="http://www.baidu.com" target="_blank" rel="noopener noreffer ">http://www.baidu.com&lt;/a>)，在搜索框中输入selenium并按下回车键。&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;p>新建文件simple_automation_script.js，并键入下面的内容。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">webdriver&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;selenium-webdriver&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">By&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">Key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Key&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">dr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Builder&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">forBrowser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;chrome&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">build&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;http://www.baidu.com&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;kw&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;selenium&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;kw&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">Key&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">RETURN&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;quit driver&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">quit&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="运行">运行&lt;/h3>
&lt;p>在命令行中运行&lt;/p>
&lt;pre tabindex="0">&lt;code>node simple_automation_script.js
&lt;/code>&lt;/pre>&lt;h3 id="常见错误">常见错误&lt;/h3>
&lt;ul>
&lt;li>&lt;code>WebDriverError: unknown error: unhandled inspector error: {&amp;quot;code&amp;quot;:-32000,&amp;quot;message&amp;quot;:&amp;quot;Cannot navigate to invalid URL&amp;quot;}&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>这是get时url拼写错误导致的，检查&lt;code>dr.get('http://www.baidu.com')&lt;/code>这一行url地址是否准确。&lt;/p>
&lt;ul>
&lt;li>&lt;code>NoSuchElementError: no such element: Unable to locate element: {&amp;quot;method&amp;quot;:&amp;quot;css selector&amp;quot;,&amp;quot;selector&amp;quot;:&amp;quot;*[id=&amp;quot;www&amp;quot;]&amp;quot;}&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>selenium找不到元素时会报的错，这是selenium开发者最常见的错误，没有之一。上面错误提示中很明确的告诉我们，页面上没有id为www的元素。遇到这种问题时，我们需要多尝试几种定位元素的方式。&lt;/p>
&lt;h3 id="总结">总结&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>&lt;code>new webdriver.Builder('browser name').build()&lt;/code>语句可以打开我们指定的浏览器，另外使用Builder，我们还可以使用环境变量在运行时动态指定浏览器类型，这对于持续集成来说非常方便;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>dr.findElement(By.id('element id'))&lt;/code>语句使用id来定位具体的元素;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>element.sendKeys('something')&lt;/code>语句可以向文本框中输入具体的内容;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>Key.RETURN&lt;/code>代表回车键，这些具体的键值通常与sendKeys配合使用;&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1493979969019-a78fdb263931?w=300"
 data-srcset="https://images.unsplash.com/photo-1493979969019-a78fdb263931?w=300, https://images.unsplash.com/photo-1493979969019-a78fdb263931?w=300 1.5x, https://images.unsplash.com/photo-1493979969019-a78fdb263931?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1493979969019-a78fdb263931?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（三）查看文档</title><link>https://itest2025.pages.dev/tutorials/20-003-%E4%B8%89%E6%9F%A5%E7%9C%8B%E6%96%87%E6%A1%A3/</link><pubDate>Fri, 11 Aug 2017 07:33:35 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-003-%E4%B8%89%E6%9F%A5%E7%9C%8B%E6%96%87%E6%A1%A3/</guid><description>&lt;h3 id="官方文档">官方文档&lt;/h3>
&lt;p>官方文档是最权威的参考资料。在绝大多数情况下我们应该首先从官方文档里获取帮助，如果实在是找不到结果，再考虑其他方式。&lt;/p>
&lt;p>selenium javascript 版本的文档在&lt;a href="http://seleniumhq.github.io/selenium/docs/api/javascript/index.html" target="_blank" rel="noopener noreffer ">这里&lt;/a>&lt;/p>
&lt;h3 id="stackoverflow">stackoverflow&lt;/h3>
&lt;p>除了官方文档，&lt;a href="https://stackoverflow.com/" target="_blank" rel="noopener noreffer ">stackoverflow&lt;/a>也是一个非常好的选择，很多时候去一些具体场景的使用问题，这里都有答案。&lt;/p>
&lt;p>selenium javascript的问题一般都列在&lt;a href="https://stackoverflow.com/search?q=selenium&amp;#43;javascript" target="_blank" rel="noopener noreffer ">这里&lt;/a>，我们可以通过google搜索或者直接在stackoverflow的站内进行搜索。&lt;/p>
&lt;h3 id="github">github&lt;/h3>
&lt;p>除了浏览源码之外，我们还可以在github上查看selenium的wiki以及查看selenium的已知问题。&lt;/p>
&lt;p>如果你想对selenium有进一步的了解，请看&lt;a href="https://github.com/SeleniumHQ/selenium/wiki" target="_blank" rel="noopener noreffer ">这里&lt;/a>。&lt;/p>
&lt;p>如果你遇到了一些无法解决的问题，不妨在&lt;a href="https://github.com/SeleniumHQ/selenium/issues" target="_blank" rel="noopener noreffer ">这里&lt;/a>搜索一下，可能这是官方的1个bug，在后续的版本中可能有所改进。&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1487715224545-78f0cedc19bd?w=300"
 data-srcset="https://images.unsplash.com/photo-1487715224545-78f0cedc19bd?w=300, https://images.unsplash.com/photo-1487715224545-78f0cedc19bd?w=300 1.5x, https://images.unsplash.com/photo-1487715224545-78f0cedc19bd?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1487715224545-78f0cedc19bd?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（四）通过id去定位页面上的元素</title><link>https://itest2025.pages.dev/tutorials/20-004-%E5%9B%9B%E9%80%9A%E8%BF%87id%E5%8E%BB%E5%AE%9A%E4%BD%8D%E9%A1%B5%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%85%83%E7%B4%A0/</link><pubDate>Thu, 10 Aug 2017 07:27:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-004-%E5%9B%9B%E9%80%9A%E8%BF%87id%E5%8E%BB%E5%AE%9A%E4%BD%8D%E9%A1%B5%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%85%83%E7%B4%A0/</guid><description>&lt;h3 id="关于定位">关于定位&lt;/h3>
&lt;p>UI的自动化测试的主要操作就是找到页面上的元素并且操作元素。找到元素一般有2个目的&lt;/p>
&lt;ul>
&lt;li>&lt;strong>操作元素:&lt;/strong> 比如点击，输入内容之类的&lt;/li>
&lt;li>&lt;strong>获取这个元素的某些属性:&lt;/strong> 比如获取一个段落元素(p)的内容，通过这个内容去验证测试是否达到了预期的效果(断言)&lt;/li>
&lt;/ul>
&lt;h3 id="定位方式">定位方式&lt;/h3>
&lt;p>selenium的javascript binding支持下面一些定位方法&lt;/p>
&lt;ul>
&lt;li>
&lt;p>By.className( name )&lt;/p>
&lt;/li>
&lt;li>
&lt;p>By.css( selector )&lt;/p>
&lt;/li>
&lt;li>
&lt;p>By.id( id )&lt;/p>
&lt;/li>
&lt;li>
&lt;p>By.js( script, &amp;hellip;var_args )&lt;/p>
&lt;/li>
&lt;li>
&lt;p>By.linkText( text )&lt;/p>
&lt;/li>
&lt;li>
&lt;p>By.name( name )&lt;/p>
&lt;/li>
&lt;li>
&lt;p>By.partialLinkText( text )&lt;/p>
&lt;/li>
&lt;li>
&lt;p>By.xpath( xpath )&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>在这些定位方式里，最简单最常用的定位方式就是通过元素的id进行定位&lt;/p>
&lt;h3 id="目的">目的&lt;/h3>
&lt;ul>
&lt;li>熟悉selenium webdriver 定位方式&lt;/li>
&lt;li>学会通过id属性去定位元素&lt;/li>
&lt;li>学会使用&lt;code>sendKeys()&lt;/code>方法&lt;/li>
&lt;/ul>
&lt;h3 id="练习对象">练习对象&lt;/h3>
&lt;p>我们使用&lt;a href="https://github.com/cbracco/html5-test-page/blob/master/index.html" target="_blank" rel="noopener noreffer ">html5-test-page&lt;/a>作为我们的练习对象。&lt;/p>
&lt;p>将html代码拷贝一份并保存到本地，文件名为&lt;code>index.html&lt;/code>。&lt;/p>
&lt;h3 id="场景">场景&lt;/h3>
&lt;p>我们将使用id定位下图所示的输入框，并输入一些内容&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://ooo.0o0.ooo/2017/06/29/5954b8e6b038a.png"
 data-srcset="https://ooo.0o0.ooo/2017/06/29/5954b8e6b038a.png, https://ooo.0o0.ooo/2017/06/29/5954b8e6b038a.png 1.5x, https://ooo.0o0.ooo/2017/06/29/5954b8e6b038a.png 2x"
 data-sizes="auto"
 alt="https://ooo.0o0.ooo/2017/06/29/5954b8e6b038a.png"
 title="https://ooo.0o0.ooo/2017/06/29/5954b8e6b038a.png" />&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;p>新建文件by_id.js，并键入下面的内容。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;path&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">webdriver&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;selenium-webdriver&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">By&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">testFile&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;file://&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">path&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">__dirname&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;index.html&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">dr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Builder&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">forBrowser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;chrome&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">build&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">testFile&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;input__text&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;测试教程网&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;input__password&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;password&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;input__webaddress&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;http://www.itest.info&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;input__emailaddress&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;service@itest.info&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;input__phone&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;13888888888&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;input__search&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;keywords&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;input__text2&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;6666666&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;input__text3&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;should be error&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;input__text4&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;should be valid&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="运行结果">运行结果&lt;/h3>
&lt;p>如下图所示&lt;/p></description></item><item><title>（五）通过name去定位页面上的元素</title><link>https://itest2025.pages.dev/tutorials/20-005-%E4%BA%94%E9%80%9A%E8%BF%87name%E5%8E%BB%E5%AE%9A%E4%BD%8D%E9%A1%B5%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%85%83%E7%B4%A0/</link><pubDate>Wed, 09 Aug 2017 01:45:25 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-005-%E4%BA%94%E9%80%9A%E8%BF%87name%E5%8E%BB%E5%AE%9A%E4%BD%8D%E9%A1%B5%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%85%83%E7%B4%A0/</guid><description>&lt;h3 id="表单元素">表单元素&lt;/h3>
&lt;p>一般来说表单元素的标签大多出现在&lt;code>&amp;lt;form&amp;gt;&amp;lt;/form&amp;gt;&lt;/code>标签中，比如&lt;/p>
&lt;ul>
&lt;li>&lt;code>&amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt;&lt;/code>: 单行文本框&lt;/li>
&lt;li>&lt;code>&amp;lt;input type=&amp;quot;checkbox&amp;quot;&amp;gt;&lt;/code>: checkbox&lt;/li>
&lt;li>&lt;code>&amp;lt;input type=&amp;quot;radio&amp;quot;&amp;gt;&lt;/code>: radio&lt;/li>
&lt;li>&lt;code>&amp;lt;select&amp;gt;&amp;lt;option&amp;gt;&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&lt;/code>: 下拉框&lt;/li>
&lt;li>&lt;code>&amp;lt;textarea&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/code>: 多行文本&lt;/li>
&lt;/ul>
&lt;p>如果这样元素有name属性的话，建议使用name属性去定位，因为相比较其他属性，name属性更加稳定。&lt;/p>
&lt;p>有一些元素比如checkbox和radio往往有多个name属性相同的元素，如下面的html代码所示&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">ul&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;list list--bare&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">label&lt;/span> &lt;span class="na">for&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;radio1&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">input&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;radio1&amp;#34;&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;radio&amp;#34;&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;radio&amp;#34;&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;radio&amp;#34;&lt;/span> &lt;span class="na">checked&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;checked&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> Option 1&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">label&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">label&lt;/span> &lt;span class="na">for&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;radio2&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">input&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;radio2&amp;#34;&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;radio&amp;#34;&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;radio&amp;#34;&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;radio&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> Option 2&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">label&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">label&lt;/span> &lt;span class="na">for&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;radio3&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">input&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;radio3&amp;#34;&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;radio&amp;#34;&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;radio&amp;#34;&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;radio&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> Option 3&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">label&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">ul&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这时候也可以使用name属性定位，不过需要用到后面讲的定位一组元素的知识了。&lt;/p>
&lt;h3 id="目的">目的&lt;/h3>
&lt;ul>
&lt;li>熟悉selenium webdriver 定位方式&lt;/li>
&lt;li>学会通过name属性去定位元素&lt;/li>
&lt;/ul>
&lt;h3 id="示例代码">示例代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// &amp;lt;input name=&amp;#34;username&amp;#34; /&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;username&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;测试教程网&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// &amp;lt;input name=&amp;#34;password&amp;#34; type=&amp;#34;password&amp;#34; /&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;password&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;就不告诉你&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1492446190781-58ac4285911d?w=300"
 data-srcset="https://images.unsplash.com/photo-1492446190781-58ac4285911d?w=300, https://images.unsplash.com/photo-1492446190781-58ac4285911d?w=300 1.5x, https://images.unsplash.com/photo-1492446190781-58ac4285911d?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1492446190781-58ac4285911d?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（六）通过className去定位页面上的元素</title><link>https://itest2025.pages.dev/tutorials/20-006-%E5%85%AD%E9%80%9A%E8%BF%87classname%E5%8E%BB%E5%AE%9A%E4%BD%8D%E9%A1%B5%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%85%83%E7%B4%A0/</link><pubDate>Tue, 08 Aug 2017 02:28:40 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-006-%E5%85%AD%E9%80%9A%E8%BF%87classname%E5%8E%BB%E5%AE%9A%E4%BD%8D%E9%A1%B5%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%85%83%E7%B4%A0/</guid><description>&lt;h3 id="为什么是classname">为什么是className&lt;/h3>
&lt;p>用className定位实际上是通过元素的html属性class定位，由于最早的webdriver client版本是使用java实现的，java中class是一个保留字，class不给用，所以就使用了className来替代。&lt;/p>
&lt;h3 id="复合的class属性">复合的class属性&lt;/h3>
&lt;p>selenium&lt;strong>不支持&lt;/strong>复合的class属性。比如&lt;code>class=&amp;quot;col-md-1 col-sm-2&amp;quot;&lt;/code>，我们只能通过&lt;code>col-md-1&lt;/code>或者是&lt;code>col-sm-2&lt;/code>来定位，不能同时使用这2个class进行定位。&lt;/p>
&lt;h3 id="目的">目的&lt;/h3>
&lt;ul>
&lt;li>熟悉selenium webdriver 定位方式&lt;/li>
&lt;li>学会通过class属性去定位元素&lt;/li>
&lt;/ul>
&lt;h3 id="练习对象">练习对象&lt;/h3>
&lt;p>我们使用&lt;a href="https://github.com/cbracco/html5-test-page/blob/master/index.html" target="_blank" rel="noopener noreffer ">html5-test-page&lt;/a>作为我们的练习对象。&lt;/p>
&lt;p>将html代码拷贝一份并保存到本地，文件名为&lt;code>index.html&lt;/code>。&lt;/p>
&lt;h3 id="场景">场景&lt;/h3>
&lt;p>我们将使用className定位下面html代码所示的输入框，并输入一些内容&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">label&lt;/span> &lt;span class="na">for&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;input__text3&amp;#34;&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;error&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Error&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">label&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">input&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;input__text3&amp;#34;&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;is-error&amp;#34;&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text&amp;#34;&lt;/span> &lt;span class="na">placeholder&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Text Input&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">label&lt;/span> &lt;span class="na">for&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;input__text4&amp;#34;&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;valid&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Valid&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">label&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">input&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;input__text4&amp;#34;&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;is-valid&amp;#34;&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text&amp;#34;&lt;/span> &lt;span class="na">placeholder&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Text Input&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;path&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">webdriver&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;selenium-webdriver&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">By&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">testFile&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;file://&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">path&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">__dirname&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;index.html&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">dr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Builder&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">forBrowser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;chrome&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">build&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">testFile&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">className&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;is-error&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;should be error&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">className&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;is-valid&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;should be valid&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="运行结果">运行结果&lt;/h3>
&lt;p>如下图所示&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="http://wx3.sinaimg.cn/mw690/726a2979gy1fhb4ojpahqj20ea04ydfw.jpg"
 data-srcset="http://wx3.sinaimg.cn/mw690/726a2979gy1fhb4ojpahqj20ea04ydfw.jpg, http://wx3.sinaimg.cn/mw690/726a2979gy1fhb4ojpahqj20ea04ydfw.jpg 1.5x, http://wx3.sinaimg.cn/mw690/726a2979gy1fhb4ojpahqj20ea04ydfw.jpg 2x"
 data-sizes="auto"
 alt="http://wx3.sinaimg.cn/mw690/726a2979gy1fhb4ojpahqj20ea04ydfw.jpg"
 title="http://wx3.sinaimg.cn/mw690/726a2979gy1fhb4ojpahqj20ea04ydfw.jpg" />&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1492446190781-58ac4285911d?w=300"
 data-srcset="https://images.unsplash.com/photo-1492446190781-58ac4285911d?w=300, https://images.unsplash.com/photo-1492446190781-58ac4285911d?w=300 1.5x, https://images.unsplash.com/photo-1492446190781-58ac4285911d?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1492446190781-58ac4285911d?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（七）通过linkText去定位页面上的元素</title><link>https://itest2025.pages.dev/tutorials/20-007-%E4%B8%83%E9%80%9A%E8%BF%87linktext%E5%8E%BB%E5%AE%9A%E4%BD%8D%E9%A1%B5%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%85%83%E7%B4%A0/</link><pubDate>Mon, 07 Aug 2017 02:59:32 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-007-%E4%B8%83%E9%80%9A%E8%BF%87linktext%E5%8E%BB%E5%AE%9A%E4%BD%8D%E9%A1%B5%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%85%83%E7%B4%A0/</guid><description>&lt;h3 id="链接的定位">链接的定位&lt;/h3>
&lt;p>链接可以使用By.linkText和By.partialLinkText的方式去定位。&lt;/p>
&lt;p>链接的html标签是&lt;code>&amp;lt;a&amp;gt;&amp;lt;/a&amp;gt;&lt;/code>。&lt;/p>
&lt;p>看这个html代码&lt;code>&amp;lt;a href=&amp;quot;http://www.itet.info&amp;quot;&amp;gt;这就是linkText&amp;lt;a&amp;gt;&lt;/code>，这里**[这就是linkText]** 便是这个链接的linkText，partialLinkText指的是部分的链接文本，如果链接的文本过长的时候，使用partialLinkText会起到简化代码的作用。&lt;/p>
&lt;h3 id="目的">目的&lt;/h3>
&lt;ul>
&lt;li>熟悉selenium webdriver 定位方式&lt;/li>
&lt;li>学会通过linkText和partialLinkText属性去定位元素&lt;/li>
&lt;li>学会使用&lt;code>getAttribute()&lt;/code>方法获取html元素的属性&lt;/li>
&lt;li>学会使用&lt;code>then()&lt;/code>方法传入回调函数来搞定Thenable的Promise&lt;/li>
&lt;/ul>
&lt;h3 id="练习对象">练习对象&lt;/h3>
&lt;p>我们使用&lt;a href="https://github.com/cbracco/html5-test-page/blob/master/index.html" target="_blank" rel="noopener noreffer ">html5-test-page&lt;/a>作为我们的练习对象。&lt;/p>
&lt;p>将html代码拷贝一份并保存到本地，文件名为&lt;code>index.html&lt;/code>。&lt;/p>
&lt;h3 id="场景">场景&lt;/h3>
&lt;p>定位下面html代码所示的a元素，并打印这些元素的href属性&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">ul&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">a&lt;/span> &lt;span class="na">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;#text__headings&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Headings&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">a&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">a&lt;/span> &lt;span class="na">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;#text__paragraphs&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Paragraphs&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">a&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">a&lt;/span> &lt;span class="na">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;#text__blockquotes&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Blockquotes&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">a&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">a&lt;/span> &lt;span class="na">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;#text__lists&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Lists&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">a&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">a&lt;/span> &lt;span class="na">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;#text__hr&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Horizontal rules&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">a&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">a&lt;/span> &lt;span class="na">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;#text__tables&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Tabular data&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">a&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">a&lt;/span> &lt;span class="na">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;#text__code&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Code&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">a&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">a&lt;/span> &lt;span class="na">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;#text__inline&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Inline elements&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">a&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">li&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">ul&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;path&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">webdriver&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;selenium-webdriver&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">By&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">testFile&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;file://&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">path&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">__dirname&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;index.html&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">dr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Builder&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">forBrowser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;chrome&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">build&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">testFile&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">linkText&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Headings&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">getAttribute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;href&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">linkText&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Paragraphs&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">getAttribute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;href&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">linkText&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Blockquotes&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">getAttribute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;href&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">linkText&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Lists&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">getAttribute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;href&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">linkText&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Horizontal rules&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">getAttribute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;href&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">linkText&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Tabular data&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">getAttribute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;href&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">linkText&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Code&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">getAttribute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;href&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">partialLinkText&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Inline&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">getAttribute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;href&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">quit&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="运行结果">运行结果&lt;/h3>
&lt;p>xxxx代表你的本机index.html的路径&lt;/p></description></item><item><title>（八）通过css选择器去定位页面上的元素</title><link>https://itest2025.pages.dev/tutorials/20-008-%E5%85%AB%E9%80%9A%E8%BF%87css%E9%80%89%E6%8B%A9%E5%99%A8%E5%8E%BB%E5%AE%9A%E4%BD%8D%E9%A1%B5%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%85%83%E7%B4%A0/</link><pubDate>Sun, 06 Aug 2017 03:41:18 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-008-%E5%85%AB%E9%80%9A%E8%BF%87css%E9%80%89%E6%8B%A9%E5%99%A8%E5%8E%BB%E5%AE%9A%E4%BD%8D%E9%A1%B5%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%85%83%E7%B4%A0/</guid><description>&lt;h3 id="css选择器">css选择器&lt;/h3>
&lt;p>火狐的&lt;a href="https://developer.mozilla.org/zh-CN/docs/Learn/CSS" target="_blank" rel="noopener noreffer ">css教程&lt;/a>应该是比较权威的css入门教程了。&lt;/p>
&lt;p>对于selenium自动化测试来说，大家只需要掌握一些必备的&lt;a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Selectors" target="_blank" rel="noopener noreffer ">css选择器&lt;/a>知识就好了。&lt;/p>
&lt;h3 id="目的">目的&lt;/h3>
&lt;ul>
&lt;li>熟悉selenium webdriver 定位方式&lt;/li>
&lt;li>学会通过css选择器去定位元素&lt;/li>
&lt;/ul>
&lt;h3 id="练习对象">练习对象&lt;/h3>
&lt;p>我们使用&lt;a href="https://github.com/cbracco/html5-test-page/blob/master/index.html" target="_blank" rel="noopener noreffer ">html5-test-page&lt;/a>作为我们的练习对象。&lt;/p>
&lt;p>将html代码拷贝一份并保存到本地，文件名为&lt;code>index.html&lt;/code>。&lt;/p>
&lt;h3 id="场景">场景&lt;/h3>
&lt;p>定位下面html代码所示的输入框，并使用sendKeys输入一些内容。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">label&lt;/span> &lt;span class="na">for&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;input__search&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Search&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">label&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">input&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;input__search&amp;#34;&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;search&amp;#34;&lt;/span> &lt;span class="na">placeholder&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Enter Search Term&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">label&lt;/span> &lt;span class="na">for&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;input__text2&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Number Input&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">label&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">input&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;input__text2&amp;#34;&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;number&amp;#34;&lt;/span> &lt;span class="na">placeholder&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Enter a Number&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">label&lt;/span> &lt;span class="na">for&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;input__text3&amp;#34;&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;error&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Error&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">label&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">input&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;input__text3&amp;#34;&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;is-error&amp;#34;&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text&amp;#34;&lt;/span> &lt;span class="na">placeholder&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Text Input&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">label&lt;/span> &lt;span class="na">for&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;input__text4&amp;#34;&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;valid&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Valid&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">label&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">input&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;input__text4&amp;#34;&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;is-valid&amp;#34;&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text&amp;#34;&lt;/span> &lt;span class="na">placeholder&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Text Input&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;path&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">webdriver&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;selenium-webdriver&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">By&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">testFile&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;file://&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">path&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">__dirname&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;index.html&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">dr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Builder&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">forBrowser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;chrome&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">build&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">testFile&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// id selector
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">css&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;#input__search&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;测试教程网&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// attribute selector
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">css&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;input[type=&amp;#34;number&amp;#34;]&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;66666&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// class selector
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">css&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.is-error&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;should be error&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// class selector
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">css&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.is-valid&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;should be valid&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="运行结果">运行结果&lt;/h3>
&lt;p>如下图所示&lt;/p></description></item><item><title>（九）通过xpath去定位页面上的元素</title><link>https://itest2025.pages.dev/tutorials/20-009-%E4%B9%9D%E9%80%9A%E8%BF%87xpath%E5%8E%BB%E5%AE%9A%E4%BD%8D%E9%A1%B5%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%85%83%E7%B4%A0/</link><pubDate>Sat, 05 Aug 2017 02:49:18 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-009-%E4%B9%9D%E9%80%9A%E8%BF%87xpath%E5%8E%BB%E5%AE%9A%E4%BD%8D%E9%A1%B5%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%85%83%E7%B4%A0/</guid><description>&lt;h3 id="xpath教程">xpath教程&lt;/h3>
&lt;p>&lt;a href="http://www.w3school.com.cn/xpath/" target="_blank" rel="noopener noreffer ">自学xpath&lt;/a>&lt;/p>
&lt;h3 id="xpath语法要点">xpath语法要点&lt;/h3>
&lt;ul>
&lt;li>&lt;code>nodename&lt;/code>	选取此节点的所有子节点。&lt;/li>
&lt;li>&lt;code>/&lt;/code>	从根节点选取。&lt;/li>
&lt;li>&lt;code>//&lt;/code>	从匹配选择的当前节点选择文档中的节点，而不考虑它们的位置。&lt;/li>
&lt;li>&lt;code>.&lt;/code>	选取当前节点。&lt;/li>
&lt;li>&lt;code>..&lt;/code>	选取当前节点的父节点。&lt;/li>
&lt;li>&lt;code>@&lt;/code>	选取属性。&lt;/li>
&lt;/ul>
&lt;h3 id="示例代码">示例代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// &amp;lt;input id=&amp;#34;input__text2&amp;#34; type=&amp;#34;number&amp;#34; placeholder=&amp;#34;Enter a Number&amp;#34;&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">xpath&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;//input[@type=&amp;#34;number&amp;#34;]&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;66666&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="总结">总结&lt;/h3>
&lt;p>css和xpath选择器大家只需要精通其中一种就可以了。&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1447433693259-c8549e937d62?w=300"
 data-srcset="https://images.unsplash.com/photo-1447433693259-c8549e937d62?w=300, https://images.unsplash.com/photo-1447433693259-c8549e937d62?w=300 1.5x, https://images.unsplash.com/photo-1447433693259-c8549e937d62?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1447433693259-c8549e937d62?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（十）模拟键盘按键</title><link>https://itest2025.pages.dev/tutorials/20-010-%E5%8D%81%E6%A8%A1%E6%8B%9F%E9%94%AE%E7%9B%98%E6%8C%89%E9%94%AE/</link><pubDate>Fri, 04 Aug 2017 02:49:18 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-010-%E5%8D%81%E6%A8%A1%E6%8B%9F%E9%94%AE%E7%9B%98%E6%8C%89%E9%94%AE/</guid><description>&lt;h3 id="sendkeys">sendKeys&lt;/h3>
&lt;p>sendKeys()方法可以用来模拟用户按下键盘，组合键比如&lt;code>ctrl+c&lt;/code>等也可以模拟。&lt;/p>
&lt;h3 id="目的">目的&lt;/h3>
&lt;ul>
&lt;li>学会使用sendKeys方法&lt;/li>
&lt;li>学会使用模拟&lt;a href="http://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index_exports_Key.html" target="_blank" rel="noopener noreffer ">特殊按钮&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="场景">场景&lt;/h3>
&lt;p>测试中我们经常会打开一个页面，然后一下往下拉，直到滚动条拉到最底部，这怎么用selenium来实现呢？&lt;/p>
&lt;p>其实我们可以用模拟按空格键的方式实现。大家都知道，在页面上一直按空格键，页面就会到达最底部，当然这并不精确，但大多数时候都是管用的。&lt;/p>
&lt;p>下面我们就用代码实现打开&lt;a href="http://www.qq.com/" target="_blank" rel="noopener noreffer ">qq首页&lt;/a>，然后模拟按10下空格键，使页面滚动到最最底部。&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">webdriver&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;selenium-webdriver&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">By&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">Key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Key&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">dr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Builder&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">forBrowser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;chrome&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">build&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;http://www.qq.com&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 把页面的body找到，在body上模拟按钮，这是整页面模拟按键事件的小技巧
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">body&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">css&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;body&amp;#34;&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 每隔1.5s按一次空格键
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// setTimeout在js binding中相当于其他binding中的sleep功能
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nx">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nx">i&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">setTimeout&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">body&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">sendKeys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">Key&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">SPACE&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span> &lt;span class="nx">i&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">1500&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="运行结果">运行结果&lt;/h3>
&lt;p>页面会缓慢的滚到最底部，如果你的页面滚到中间就停住了，增加滚动次数即可。&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1475299137256-e36862458196?w=300"
 data-srcset="https://images.unsplash.com/photo-1475299137256-e36862458196?w=300, https://images.unsplash.com/photo-1475299137256-e36862458196?w=300 1.5x, https://images.unsplash.com/photo-1475299137256-e36862458196?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1475299137256-e36862458196?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（十一）ActionSequence</title><link>https://itest2025.pages.dev/tutorials/20-011-%E5%8D%81%E4%B8%80actionsequence/</link><pubDate>Thu, 03 Aug 2017 02:49:18 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-011-%E5%8D%81%E4%B8%80actionsequence/</guid><description>&lt;h3 id="组合事件">组合事件&lt;/h3>
&lt;p>当页面的交互比较复杂的时候，我们可能会使用到组合事件。比如先把鼠标移动到某个元素上，然后按住鼠标，将该元素拖到另一个地方。为了完成这种操作，我们就需要使用组合事件&lt;a href="http://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index_exports_ActionSequence.html" target="_blank" rel="noopener noreffer ">ActionSequence&lt;/a>&lt;/p>
&lt;p>组合事件中，我们可以组合鼠标和键盘的操作，这些操作将根据我们组合的顺序依次执行。&lt;/p>
&lt;h3 id="基本用法">基本用法&lt;/h3>
&lt;ul>
&lt;li>直接使用&lt;code>WebDriver.actions()&lt;/code>进行调用，不需要额外的初始化工作;&lt;/li>
&lt;li>只有显示调用了&lt;code>perform()&lt;/code>方法才让所有动作真正得到执行；简而言之，一定要调用&lt;code>perform()&lt;/code>;&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">driver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">actions&lt;/span>&lt;span class="p">().&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">keyDown&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">Key&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">SHIFT&lt;/span>&lt;span class="p">).&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">element1&lt;/span>&lt;span class="p">).&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">element2&lt;/span>&lt;span class="p">).&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">dragAndDrop&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">element3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">element4&lt;/span>&lt;span class="p">).&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">keyUp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">Key&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">SHIFT&lt;/span>&lt;span class="p">).&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">perform&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="实例方法">实例方法&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>click( opt_elementOrButton, opt_button ): 单击，相当于把鼠标移动到元素的中心，然后点击左键&lt;/p>
&lt;/li>
&lt;li>
&lt;p>doubleClick( opt_elementOrButton, opt_button ): 双击, 相当于把鼠标移动到元素的中心，然后双击左键&lt;/p>
&lt;/li>
&lt;li>
&lt;p>this.dragAndDrop( element, location ): 拖拽，第1个参数是拖谁(WebElement)，第2个参数是拽到哪里，可以是WebElement，也可以是坐标&lt;code>{x: number, y: number}&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>this.keyDown( key ): 按下一个键，必须是{ALT, CONTROL, SHIFT, COMMAND, META}中的一个， 会一直按着，除非调用keyUp()进行松开&lt;/p>
&lt;/li>
&lt;li>
&lt;p>this.keyUp( key ): 松开一个键，必须是{ALT, CONTROL, SHIFT, COMMAND, META}中的一个&lt;/p>
&lt;/li>
&lt;li>
&lt;p>this.mouseDown( opt_elementOrButton, opt_button ): 按下鼠标，除非mouseUp，否则不松开&lt;/p>
&lt;/li>
&lt;li>
&lt;p>this.mouseMove( location, opt_offset ): 把鼠标移动到元素的中心或者具体位置，当然，第2个参数可以也可以增加1个偏移量, &lt;code>{x: number, y: number}&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>this.mouseUp( opt_elementOrButton, opt_button ): 松开鼠标&lt;/p></description></item><item><title>（十二）定位一组元素</title><link>https://itest2025.pages.dev/tutorials/20-012-%E5%8D%81%E4%BA%8C%E5%AE%9A%E4%BD%8D%E4%B8%80%E7%BB%84%E5%85%83%E7%B4%A0/</link><pubDate>Wed, 02 Aug 2017 07:27:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-012-%E5%8D%81%E4%BA%8C%E5%AE%9A%E4%BD%8D%E4%B8%80%E7%BB%84%E5%85%83%E7%B4%A0/</guid><description>&lt;h3 id="定位一组元素">定位一组元素&lt;/h3>
&lt;p>定位一组元素一般有如下的作用&lt;/p>
&lt;ul>
&lt;li>找到一组属性部分相同的元素，遍历元素，做一些批量操作&lt;/li>
&lt;li>找到一组属性部分相同的元素，遍历元素，返回&lt;strong>1个或几个&lt;/strong>特定的元素，做更精确的定位&lt;/li>
&lt;/ul>
&lt;p>findElements方法可以定位一组元素。该方法的参数跟findElement方法一致。&lt;/p>
&lt;h3 id="目的">目的&lt;/h3>
&lt;ul>
&lt;li>学会使用findElements方法&lt;/li>
&lt;li>学会使用getAttribute方法&lt;/li>
&lt;/ul>
&lt;h3 id="场景">场景&lt;/h3>
&lt;p>打印&lt;a href="http://www.testclass.net/" target="_blank" rel="noopener noreffer ">测试教程网&lt;/a>中所有的&lt;a href="http://www.testclass.net/selenium_javascript/" target="_blank" rel="noopener noreffer ">selenium javascript&lt;/a>教程的链接&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">webdriver&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;selenium-webdriver&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">By&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">dr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Builder&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">forBrowser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;chrome&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">build&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;http://www.testclass.net/selenium_javascript/&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElements&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">css&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.post-stub a&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">links&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nx">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="nx">links&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">length&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nx">i&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">links&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">i&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">getAttribute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;href&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">href&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">quit&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="运行结果">运行结果&lt;/h3>
&lt;p>如下所示&lt;/p>
&lt;pre tabindex="0">&lt;code>http://www.testclass.net/selenium_javascript/init/
http://www.testclass.net/selenium_javascript/simple_automation_scripts/
http://www.testclass.net/selenium_javascript/view_document/
http://www.testclass.net/selenium_javascript/by_id/
http://www.testclass.net/selenium_javascript/by_name/
http://www.testclass.net/selenium_javascript/by_classname/
http://www.testclass.net/selenium_javascript/by_link_text/
http://www.testclass.net/selenium_javascript/by_css/
http://www.testclass.net/selenium_javascript/by_xpath/
http://www.testclass.net/selenium_javascript/keyboard/
http://www.testclass.net/selenium_javascript/action_sequence/
......
......
......
......
&lt;/code>&lt;/pre>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1477005264461-b0e201668d92?w=300"
 data-srcset="https://images.unsplash.com/photo-1477005264461-b0e201668d92?w=300, https://images.unsplash.com/photo-1477005264461-b0e201668d92?w=300 1.5x, https://images.unsplash.com/photo-1477005264461-b0e201668d92?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1477005264461-b0e201668d92?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（十三）切换frame</title><link>https://itest2025.pages.dev/tutorials/20-013-%E5%8D%81%E4%B8%89%E5%88%87%E6%8D%A2frame/</link><pubDate>Tue, 01 Aug 2017 07:27:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-013-%E5%8D%81%E4%B8%89%E5%88%87%E6%8D%A2frame/</guid><description>&lt;h3 id="为什么要切换">为什么要切换&lt;/h3>
&lt;p>当我们要定位的元素位于页面中的iframe或frame标签中时，我们必须将定位的上下文切换到对应的frame中去，否则我们将没有办法定位到frame中的元素，这是套路，可以先无脑记住。&lt;/p>
&lt;h3 id="目的">目的&lt;/h3>
&lt;p>学会使用switchTo().frame(id)方法&lt;/p>
&lt;h3 id="switchtoframeid方法详解">switchTo().frame(id)方法详解&lt;/h3>
&lt;ul>
&lt;li>id可以是1个数字，从0开始。switchTo().frame(0)表示切换到页面上的第1个frame，依此类推;&lt;/li>
&lt;li>id也可以是1个WebElement对象，也就是需要切换到的frame;&lt;/li>
&lt;li>id可以是null，等于是调用了switchTo().defaultContent()方法;&lt;/li>
&lt;/ul>
&lt;h3 id="switchtodefaultcontent方法">switchTo().defaultContent()方法&lt;/h3>
&lt;p>切换回到主页面，调用这个方法会将定位的上下文切回主页面，此后就可以继续定位主页面上的元素了。&lt;/p>
&lt;h3 id="示例代码">示例代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">webdriver&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;selenium-webdriver&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">By&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">dr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Builder&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">forBrowser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;chrome&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">build&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;some url&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 切换到第2个frame进行元素定位
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">switchTo&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">frame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;this-element-is-in-frame&amp;#39;&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 切换到第id==example-frame的frame中进行元素定位
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;example-frame&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">iframe&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">switchTo&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">frame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">iframe&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;this-element-is-in-frame&amp;#39;&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 切换回主页面
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">switchTo&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">defaultContent&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1502481851512-e9e2529bfbf9?w=300"
 data-srcset="https://images.unsplash.com/photo-1502481851512-e9e2529bfbf9?w=300, https://images.unsplash.com/photo-1502481851512-e9e2529bfbf9?w=300 1.5x, https://images.unsplash.com/photo-1502481851512-e9e2529bfbf9?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1502481851512-e9e2529bfbf9?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（十四）处理下拉列表 select</title><link>https://itest2025.pages.dev/tutorials/20-014-%E5%8D%81%E5%9B%9B%E5%A4%84%E7%90%86%E4%B8%8B%E6%8B%89%E5%88%97%E8%A1%A8-select/</link><pubDate>Tue, 01 Aug 2017 01:49:18 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-014-%E5%8D%81%E5%9B%9B%E5%A4%84%E7%90%86%E4%B8%8B%E6%8B%89%E5%88%97%E8%A1%A8-select/</guid><description>&lt;h3 id="什么是下拉列表">什么是下拉列表&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">select&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;select&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">optgroup&lt;/span> &lt;span class="na">label&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Option Group&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">option&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Option One&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">option&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">option&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Option Two&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">option&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">option&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Option Three&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">option&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">optgroup&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>下拉列表的标签是select，如上所示，其中&lt;/p>
&lt;ul>
&lt;li>select表示下拉列表&lt;/li>
&lt;li>option表示列表里的子项&lt;/li>
&lt;/ul>
&lt;p>上面的html里，这个下拉列表中一共有3项，分别是Option One, Option Two和Option Three。&lt;/p>
&lt;h3 id="目的">目的&lt;/h3>
&lt;ul>
&lt;li>学会选择下拉列表里的特定项目&lt;/li>
&lt;li>学会使用层级定位&lt;/li>
&lt;/ul>
&lt;h3 id="场景">场景&lt;/h3>
&lt;p>选择上面html代码所示的下拉列表的最后一项，也就是Option Three。&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;path&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">webdriver&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;selenium-webdriver&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">By&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">testFile&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;file://&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">path&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">__dirname&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;index.html&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">dr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Builder&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">forBrowser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;chrome&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">build&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">testFile&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;select&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">select&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElements&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">css&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;option&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">options&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">options&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">options&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">length&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">click&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="运行结果">运行结果&lt;/h3>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="http://wx4.sinaimg.cn/mw1024/726a2979gy1fhp1kxp8qdj20f606kaa6.jpg"
 data-srcset="http://wx4.sinaimg.cn/mw1024/726a2979gy1fhp1kxp8qdj20f606kaa6.jpg, http://wx4.sinaimg.cn/mw1024/726a2979gy1fhp1kxp8qdj20f606kaa6.jpg 1.5x, http://wx4.sinaimg.cn/mw1024/726a2979gy1fhp1kxp8qdj20f606kaa6.jpg 2x"
 data-sizes="auto"
 alt="http://wx4.sinaimg.cn/mw1024/726a2979gy1fhp1kxp8qdj20f606kaa6.jpg"
 title="http://wx4.sinaimg.cn/mw1024/726a2979gy1fhp1kxp8qdj20f606kaa6.jpg" />&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1450631835004-9b95ff5cd66f?w=300"
 data-srcset="https://images.unsplash.com/photo-1450631835004-9b95ff5cd66f?w=300, https://images.unsplash.com/photo-1450631835004-9b95ff5cd66f?w=300 1.5x, https://images.unsplash.com/photo-1450631835004-9b95ff5cd66f?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1450631835004-9b95ff5cd66f?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（十五）切换窗口(标签)</title><link>https://itest2025.pages.dev/tutorials/20-015-%E5%8D%81%E4%BA%94%E5%88%87%E6%8D%A2%E7%AA%97%E5%8F%A3%E6%A0%87%E7%AD%BE/</link><pubDate>Mon, 31 Jul 2017 23:49:18 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-015-%E5%8D%81%E4%BA%94%E5%88%87%E6%8D%A2%E7%AA%97%E5%8F%A3%E6%A0%87%E7%AD%BE/</guid><description>&lt;h3 id="切换窗口">切换窗口&lt;/h3>
&lt;p>有时候我们点击链接会弹出新窗口，我们需要去新窗口继续定位和操作元素，这时候就需要用到切换窗口的操作了。&lt;/p>
&lt;p>switchTo().window(name_or_handle)方法可以切换到目标窗口。&lt;/p>
&lt;p>一般来说，不建议大家直接使用上面的方法去切换，更明智的做法是获取要打开的窗口的链接，然后直接用get访问该链接，这样就不需要写切换窗口的代码了。&lt;/p>
&lt;h3 id="switchtowindowname_or_handle">switchTo().window(name_or_handle)&lt;/h3>
&lt;p>该方法的参数有可以是&lt;/p>
&lt;ul>
&lt;li>窗口的name，这是为了兼容以前的实现，至于窗口的name是什么，我不太清楚&lt;/li>
&lt;li>窗口句柄，使用driver.getAllWindowHandles()句柄就可以返回浏览器中所有的打开的标签句柄了&lt;/li>
&lt;/ul>
&lt;h3 id="目的">目的&lt;/h3>
&lt;p>学会使用switchTo().window(name_or_handle)方法&lt;/p>
&lt;h3 id="示例代码">示例代码&lt;/h3>
&lt;p>下面代码演示了如何遍历浏览器所有的标签，并逐一切换过去&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">getAllWindowHandles&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">handles&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">}{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nx">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="nx">handles&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">length&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nx">i&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">switchTo&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nb">window&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">handles&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">i&lt;/span>&lt;span class="p">]);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1483356256511-b48749959172?w=300"
 data-srcset="https://images.unsplash.com/photo-1483356256511-b48749959172?w=300, https://images.unsplash.com/photo-1483356256511-b48749959172?w=300 1.5x, https://images.unsplash.com/photo-1483356256511-b48749959172?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1483356256511-b48749959172?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（十六）执行javascript</title><link>https://itest2025.pages.dev/tutorials/20-016-%E5%8D%81%E5%85%AD%E6%89%A7%E8%A1%8Cjavascript/</link><pubDate>Mon, 31 Jul 2017 02:49:18 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-016-%E5%8D%81%E5%85%AD%E6%89%A7%E8%A1%8Cjavascript/</guid><description>&lt;h3 id="执行javascript">执行javascript&lt;/h3>
&lt;p>使用driver.executeScript(js)方法会在当前的定位上下文里执行相应的js脚本。&lt;/p>
&lt;h3 id="传参">传参&lt;/h3>
&lt;p>executeScript方法支持向脚本中传入参数，所有参数的参数都可以在脚本中通过&lt;code>arguments&lt;/code>对象来引用。我们可以传入下列类型的参数:&lt;/p>
&lt;ul>
&lt;li>boolean&lt;/li>
&lt;li>number&lt;/li>
&lt;li>string&lt;/li>
&lt;li>WebElement:也就是我们定位到的页面对象&lt;/li>
&lt;li>Array或者是Object: 只要里面的每一项都是上面的类型就好了&lt;/li>
&lt;/ul>
&lt;h3 id="返回值">返回值&lt;/h3>
&lt;p>同样的，我们可以接收js脚本的返回值，返回值有下面一些情况&lt;/p>
&lt;ul>
&lt;li>如果js返回HTML元素，那么该元素会自动被封装成WebElement&lt;/li>
&lt;li>null 或者 undefined会被转成null&lt;/li>
&lt;li>boolean, number, string 不做转换&lt;/li>
&lt;li>function会被转成相应的字符串表示&lt;/li>
&lt;li>Array和Object中的每一项都按照上面的规则转换&lt;/li>
&lt;/ul>
&lt;h3 id="目的">目的&lt;/h3>
&lt;ul>
&lt;li>学会使用executeScript(js)方法&lt;/li>
&lt;li>学会向js脚本中传参&lt;/li>
&lt;li>学会从js脚本中接收返回值&lt;/li>
&lt;/ul>
&lt;h3 id="场景">场景&lt;/h3>
&lt;p>打开&lt;a href="http://www.baidu.com/" target="_blank" rel="noopener noreffer ">百度首页&lt;/a>&lt;/p>
&lt;ul>
&lt;li>先隐藏掉&lt;strong>百度一下&lt;/strong>按钮&lt;/li>
&lt;li>然后返回页面上所有导航链接的文本&lt;/li>
&lt;li>最后把页面背景变成黑色&lt;/li>
&lt;/ul>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;path&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">webdriver&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;selenium-webdriver&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">By&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;http://www.baidu.com/&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">dr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Builder&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">forBrowser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;chrome&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">build&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">url&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 先隐藏掉百度一下按钮
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 通过arguments[0]传入百度一下按钮
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">hideBtn&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;arguments[0].style.display=&amp;#39;none&amp;#39;;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">executeScript&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">hideBtn&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;su&amp;#39;&lt;/span>&lt;span class="p">)));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 然后返回页面上所有导航链接的文本
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 通过return返回需要的结果
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">linkTexts&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;return $(&amp;#39;.mnav&amp;#39;).text()&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">executeScript&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">linkTexts&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">texts&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">texts&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 最后把页面背景变成黑色
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">executeScript&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;document.body.style.backgroundColor=&amp;#39;black&amp;#39;&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="运行结果">运行结果&lt;/h3>
&lt;p>浏览器&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="http://wx4.sinaimg.cn/mw1024/726a2979gy1fhp354hg8ij21ku0xegop.jpg"
 data-srcset="http://wx4.sinaimg.cn/mw1024/726a2979gy1fhp354hg8ij21ku0xegop.jpg, http://wx4.sinaimg.cn/mw1024/726a2979gy1fhp354hg8ij21ku0xegop.jpg 1.5x, http://wx4.sinaimg.cn/mw1024/726a2979gy1fhp354hg8ij21ku0xegop.jpg 2x"
 data-sizes="auto"
 alt="http://wx4.sinaimg.cn/mw1024/726a2979gy1fhp354hg8ij21ku0xegop.jpg"
 title="http://wx4.sinaimg.cn/mw1024/726a2979gy1fhp354hg8ij21ku0xegop.jpg" />&lt;/p></description></item><item><title>（十七）alert confirm 和 prompt</title><link>https://itest2025.pages.dev/tutorials/20-017-%E5%8D%81%E4%B8%83alert-confirm-%E5%92%8C-prompt/</link><pubDate>Mon, 31 Jul 2017 01:49:18 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-017-%E5%8D%81%E4%B8%83alert-confirm-%E5%92%8C-prompt/</guid><description>&lt;h3 id="alert-confirm-prompt">alert confirm prompt&lt;/h3>
&lt;p>原生的javascript弹出框，各个浏览器的实现不一样，外观也不太一样。&lt;/p>
&lt;p>这些弹出框会阻止页面上的所有操作，因此每次这些框弹出来以后，我们必须想办法让这些东西消失掉，否则脚本无法往下进行下去。&lt;/p>
&lt;h3 id="一般的处理方式">一般的处理方式&lt;/h3>
&lt;p>当alert弹出之后，我们可以通过类似下面的代码去处理alert&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">driver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">switchTo&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">alert&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">dismiss&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">driver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">switchTo&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">alert&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">accept&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>切换到alert/confirm/prompt之后，我们可以进行如下的后续动作&lt;/p>
&lt;ul>
&lt;li>accept(): 接受,点ok&lt;/li>
&lt;li>dismiss(): 点取消&lt;/li>
&lt;li>getText(): 拿到提示文本&lt;/li>
&lt;li>sendKeys( text ): 如果是prompt的话，可以用该方法输入一些内容&lt;/li>
&lt;li>authenticateAs( username, password ): 如果是&lt;a href="https://en.wikipedia.org/wiki/Basic_access_authentication" target="_blank" rel="noopener noreffer ">basic authentication&lt;/a>的话，可以通过该方法来输入用户名和密码&lt;/li>
&lt;/ul>
&lt;h3 id="一劳永逸的处理方式">一劳永逸的处理方式&lt;/h3>
&lt;p>如果我们不在乎alert上提示的内容，只想页面上不弹出alert/confirm/prompt的话，可以通过js来覆盖这些方法的原生实现，从而达到&lt;strong>禁用&lt;/strong>弹出框的效果，比如下面的代码就演示了如何禁用alert。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">banAlert&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;window.alert = function(msg){}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">driver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">executeScript&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">banAlert&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样在测试过程中，所有的alert都不会弹出。&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1527467779599-34448b3fa6a7?w=300"
 data-srcset="https://images.unsplash.com/photo-1527467779599-34448b3fa6a7?w=300, https://images.unsplash.com/photo-1527467779599-34448b3fa6a7?w=300 1.5x, https://images.unsplash.com/photo-1527467779599-34448b3fa6a7?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1527467779599-34448b3fa6a7?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（十八）截图</title><link>https://itest2025.pages.dev/tutorials/20-018-%E5%8D%81%E5%85%AB%E6%88%AA%E5%9B%BE/</link><pubDate>Sun, 30 Jul 2017 02:49:18 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-018-%E5%8D%81%E5%85%AB%E6%88%AA%E5%9B%BE/</guid><description>&lt;h3 id="截图">截图&lt;/h3>
&lt;p>在测试用例失败的时候进行截图，这是大家经常会遇到的需求。&lt;/p>
&lt;h3 id="目的">目的&lt;/h3>
&lt;ul>
&lt;li>学会使用takeScreenshot()方法&lt;/li>
&lt;/ul>
&lt;h3 id="场景">场景&lt;/h3>
&lt;p>下面我们就用代码实现打开&lt;a href="http://www.testclass.net/selenium_javascript/" target="_blank" rel="noopener noreffer ">测试教程网 selenium javascript教程&lt;/a>，然后截图的功能&lt;/p>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">webdriver&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;selenium-webdriver&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">By&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">Key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Key&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">dr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Builder&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">forBrowser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;chrome&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">build&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;http://www.testclass.net/selenium_javascript/&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">takeScreenshot&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">data&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;fs&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">writeFile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pic.png&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;base64&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">quit&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="运行结果">运行结果&lt;/h3>
&lt;p>脚本目录下会出现pic.png文件。&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1504966981333-1ac8809be1ca?w=300"
 data-srcset="https://images.unsplash.com/photo-1504966981333-1ac8809be1ca?w=300, https://images.unsplash.com/photo-1504966981333-1ac8809be1ca?w=300 1.5x, https://images.unsplash.com/photo-1504966981333-1ac8809be1ca?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1504966981333-1ac8809be1ca?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（十九）wait和sleep</title><link>https://itest2025.pages.dev/tutorials/20-019-%E5%8D%81%E4%B9%9Dwait%E5%92%8Csleep/</link><pubDate>Sat, 29 Jul 2017 02:48:18 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-019-%E5%8D%81%E4%B9%9Dwait%E5%92%8Csleep/</guid><description>&lt;h3 id="wait-condition-opt_timeout-opt_message-">wait&lt;T>( condition, opt_timeout, opt_message )&lt;/h3>
&lt;p>wait方法一般用来等待页面上某些条件得到满足后才继续执行脚本。比如等待页面上某个弹出框出现，等某个元素可以被定位到之类。&lt;/p>
&lt;p>wait方法中可以传入&lt;a href="http://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_Condition.html" target="_blank" rel="noopener noreffer ">Condition&lt;/a>表示一般性条件和&lt;a href="http://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElementCondition.html" target="_blank" rel="noopener noreffer ">WebElementCondition&lt;/a>。&lt;/p>
&lt;p>如果传入的元素级条件被满足，那么wait方法会返回&lt;a href="http://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebElementPromise.html" target="_blank" rel="noopener noreffer "> WebElementPromise&lt;/a>，也就是说可以直接返回满足条件的元素。&lt;/p>
&lt;p>如果在规定的时间内(也就是第2个参数)没有等到条件被满足，那么该方法会抛出异常。&lt;/p>
&lt;p>一般性用法示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 在10s内id是foo的元素被定位到，然后点击之
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">button&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">driver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">wait&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">until&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">elementLocated&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">id&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;foo&amp;#39;&lt;/span>&lt;span class="p">)),&lt;/span> &lt;span class="mi">10000&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">button&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">click&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>另外wait还可以将执行中的脚本暂停住一段时间，直到第1个参数中的异步操作处理完毕，如下所示&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">started&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">startTestServer&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">driver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">wait&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">started&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">5&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">1000&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;Server should start within 5 seconds&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">driver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">getServerUrl&lt;/span>&lt;span class="p">());&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="sleep">sleep&lt;/h3>
&lt;p>sleep可以不管任何情况直接将执行中的脚本直接暂停一段时间。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;start&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">driver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">findElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">css&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;.kls&amp;#39;&lt;/span>&lt;span class="p">)).&lt;/span>&lt;span class="nx">click&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 等待3s
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">driver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3000&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">driver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">quit&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>sleep在某些时候非常好用，但是希望大家不要乱用，因为这会拖慢脚本的执行速度。&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1454817481404-7e84c1b73b4a?w=300"
 data-srcset="https://images.unsplash.com/photo-1454817481404-7e84c1b73b4a?w=300, https://images.unsplash.com/photo-1454817481404-7e84c1b73b4a?w=300 1.5x, https://images.unsplash.com/photo-1454817481404-7e84c1b73b4a?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1454817481404-7e84c1b73b4a?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（二十）until</title><link>https://itest2025.pages.dev/tutorials/20-020-%E4%BA%8C%E5%8D%81until/</link><pubDate>Thu, 27 Jul 2017 02:49:18 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-020-%E4%BA%8C%E5%8D%81until/</guid><description>&lt;h3 id="until">until&lt;/h3>
&lt;p>until一般跟wait一起用，用于等待页面上的一些条件被满足&lt;/p>
&lt;h3 id="条件一览">条件一览&lt;/h3>
&lt;ul>
&lt;li>ableToSwitchToFrame(frame): 直到selenium可以将定位上下文切换到frame里&lt;/li>
&lt;li>alertIsPresent(): 直到alert出现&lt;/li>
&lt;li>elementIsDisabled(element): 直到元素灰掉，不能被点击&lt;/li>
&lt;li>elementIsEnabled(element): 直到元素可以被点击&lt;/li>
&lt;li>elementIsNotSelected(element): 直到元素不可选&lt;/li>
&lt;li>elementIsNotVisible(element): 直到元素不可见&lt;/li>
&lt;li>elementIsSelected(element): 直到元素可选&lt;/li>
&lt;li>elementIsVisible(element): 直到元素可见&lt;/li>
&lt;li>elementLocated(locator): 最常用，直到元素可以被定位&lt;/li>
&lt;li>elementTextContains(element, substr): 直到元素的text包含substr&lt;/li>
&lt;li>elementTextIs(element, expected_text): 直到元素的text是expected_text&lt;/li>
&lt;li>elementTextMatches(element,regex): 直到元素的text满足正则表达式regex&lt;/li>
&lt;li>elementsLocated(locator): 直到一组元素被定位&lt;/li>
&lt;li>stalenessOf(element): 直到元素被dom树移除或页面刷新&lt;/li>
&lt;li>titleContains(substr): 直到页面title包含substr&lt;/li>
&lt;li>titleIs(expected_title): 直到页面的title是expected_title&lt;/li>
&lt;li>titleMatches(regex): 直到页面的title满足正则表达式regex&lt;/li>
&lt;li>urlContains(substrUrl): 直到页面url包含substrUrl&lt;/li>
&lt;li>urlIs(expected_url): 直到页面的url是expected_url&lt;/li>
&lt;li>urlMatches(regex): 直到页面的url满足正则表达式regex&lt;/li>
&lt;/ul>
&lt;h3 id="自定义条件">自定义条件&lt;/h3>
&lt;p>until还允许我们自定义条件。我们只需要传入1个回调，该回调返回真值(true)就代表等待的条件被满足。&lt;/p>
&lt;p>在javascript，真值表示所有&lt;strong>不是&lt;/strong>null, undefined, false, 0, 或 空字符串的值。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">driver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">wait&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nx">driver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">getTitle&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">title&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nx">title&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="s1">&amp;#39;测试教程网&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">},&lt;/span> &lt;span class="mi">1000&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1463780324318-d1a8ddc05a11?w=300"
 data-srcset="https://images.unsplash.com/photo-1463780324318-d1a8ddc05a11?w=300, https://images.unsplash.com/photo-1463780324318-d1a8ddc05a11?w=300 1.5x, https://images.unsplash.com/photo-1463780324318-d1a8ddc05a11?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1463780324318-d1a8ddc05a11?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（二十一）断言</title><link>https://itest2025.pages.dev/tutorials/20-021-%E4%BA%8C%E5%8D%81%E4%B8%80%E6%96%AD%E8%A8%80/</link><pubDate>Thu, 20 Jul 2017 02:49:18 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/20-021-%E4%BA%8C%E5%8D%81%E4%B8%80%E6%96%AD%E8%A8%80/</guid><description>&lt;h3 id="测试用例与断言">测试用例与断言&lt;/h3>
&lt;p>测试用例中至少需要包含1个断言，没有断言的测试脚本不能称为测试用例。&lt;/p>
&lt;p>断言就是预期和实际的比较，如果预期不等于实际，脚本将会报错。&lt;/p>
&lt;h3 id="selenium-自带断言">selenium 自带断言&lt;/h3>
&lt;p>selenium 自带了一些断言，具体看&lt;a href="http://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/testing/assert_exports_Assertion.html" target="_blank" rel="noopener noreffer ">断言&lt;/a>。&lt;/p>
&lt;h3 id="场景">场景&lt;/h3>
&lt;p>我们下面实现打开&lt;a href="http://www.testclass.net/" target="_blank" rel="noopener noreffer ">测试教程网&lt;/a>并做2个断言&lt;/p>
&lt;ul>
&lt;li>页面title包含测试教程网几个字&lt;/li>
&lt;li>页面url包含testclass几个字&lt;/li>
&lt;/ul>
&lt;h3 id="代码">代码&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">webdriver&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;selenium-webdriver&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">By&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">By&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">assert&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;selenium-webdriver/testing/assert&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">dr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">webdriver&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Builder&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">forBrowser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;chrome&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">build&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;http://www.testclass.net/&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">getTitle&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">title&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">assert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">title&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">contains&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;测试教程网&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">getCurrentUrl&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">url&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">assert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">url&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">contains&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;testclass&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">quit&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="运行结果">运行结果&lt;/h3>
&lt;p>上面断言全部通过的时候看不到任何的结果，大家可以试着修改一下断言，让断言失败，这时候就应该可以看到类似下面的信息&lt;/p>
&lt;pre tabindex="0">&lt;code>AssertionError: 测试教程网 · 测试教程网.indexOf(测试教程网12443) !== -1
&lt;/code>&lt;/pre>&lt;h3 id="测试框架">测试框架&lt;/h3>
&lt;p>在做真实的测试时，我们一般会用测试框架配合selenium一起来实现复杂的场景测试和测试报告的生成，在这里向大家推荐一些测试框架&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/mochajs/mocha" target="_blank" rel="noopener noreffer ">mocha&lt;/a>: 强烈推荐，灵活简单，可以配合selenium断言一起用&lt;/li>
&lt;li>&lt;a href="https://github.com/qunitjs/qunit" target="_blank" rel="noopener noreffer ">qunit&lt;/a>: 简单好用&lt;/li>
&lt;li>&lt;a href="https://github.com/facebook/jest" target="_blank" rel="noopener noreffer ">jest&lt;/a>: facebook出品，大树底下好乘凉&lt;/li>
&lt;li>&lt;a href="https://github.com/substack/tape" target="_blank" rel="noopener noreffer ">tape&lt;/a>: 足够简单&lt;/li>
&lt;/ul>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1502957291543-d85480254bf8?w=300"
 data-srcset="https://images.unsplash.com/photo-1502957291543-d85480254bf8?w=300, https://images.unsplash.com/photo-1502957291543-d85480254bf8?w=300 1.5x, https://images.unsplash.com/photo-1502957291543-d85480254bf8?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1502957291543-d85480254bf8?w=300"
 title="课程图片" />&lt;/p></description></item></channel></rss>