改造四:发送定位信息
在上述查看中,可以将元素信息发送给服务端,服务端根据信息解析成POJO源码,复制到项目中即可。
我这里抓取了一些元素定位信息,并发送个服务端,服务端会生成Baidu.java的类源文件。如下
POJO源文件 Baidu.java
package me.utils.selenium_utils.page; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; public class Baidu{ /** * 百度logo **/ @FindBy(xpath=".//*[@id='lg']/img") public WebElement bd_logo; /** * 搜索框 **/ @FindBy(xpath=".//*[@id='kw']") public WebElement kw; /** * hao123 **/ @FindBy(xpath=".//*[@id='u1']/a[2]") public WebElement bd_hao123; /** * 地图链接 **/ @FindBy(xpath=".//*[@id='u1']/a[3]") public WebElement bd_ditu_link; /** * 视频链接 **/ @FindBy(xpath=".//*[@id='u1']/a[4]") public WebElement bd_shipin_link; /** * 新闻链接 **/ @FindBy(xpath=".//*[@id='u1']/a[1]") public WebElement bd_news_link; /** * 搜索按钮 ** public class BaiduPage extends Baidu { public void search(String content){ kw.sendKeys(content); su.click(); }}/ @FindBy(xpath=".//*[@id='su']") public WebElement su; } |
这时我们可以下载源码,将其复制到项目中应用。注意:这里不要手动修改定位Java类源文件。如果我们需要写一些方法时,继承该定位类即可。
如下:我们写一个BaiduPage类
在测试中使用,如下
...@Test void test() throws InterruptedException{ driver = (WebDriver) context.getBean("freshWebDriver"); driver.get("http://www.baidu.com"); BaiduPage page = PageFactory.initElements(driver, BaiduPage.class); page.search("testerhome"); Thread.sleep(5000); driver.close(); }... |
为什么不能手动修改类?
好处一在于一会我们要自动修改定位信息。好处二在于,下回自动生成时,也不会使你定义的search(String content)被覆盖掉。
改造五:载入定位信息
定位是需要经常修改的,这意味这,我们经常要手动找到已经失效的元素定位信息,这是一件令人沮丧的事情。
载入的目的就是为了解决这个问题。点击载入后,会输入完整的类名,如me.utils.selenium_utils.page.Baidu。这是插件会从服务端下载定位信息。这里我们假设,刚才定位搜索框的信息是.//*[@id='kw1'],这时该定位在百度页面上无效的。我们载入看看
点击查看
看到这里显示.//*[@id='kw1']是无效的,因为在百度首页dom中根本不存在该定位元素。这时我们就可以删除后重新添加该元素。发送后会自动覆盖上次的定位信息,生成新的POJO类。
服务端
服务端的功能简单,就是收发元素定位信息,将信息生成Java源码,提供下载。这里没什么好说的,展示一下Json数据
部分
{ "name": "Baidu", "url": "https://www.baidu.com/", "elements": [ { "name": "bd_logo", "type": "xpath", "value": ".//*[@id='lg']/img", "description": "百度logo", "valid": true } ]} |
总结
至此,我们可以准确的将定位信息,自动生成Java源码,且可维护。不必复制来复制去了。这里提供给大家这个想法和实践,小弟这些愚见,如有不妥之处,望指正,欢迎拍砖!最后来个完整的图。