Web UI自动化----元素定位

1.Iframe/frame原因导致

这个原因还是比较常见的,主要是因为frame是在页面当中嵌入了另一个页面,但是webdriver定位只能定位到在一个页面上,所以不管你如何调整定位方式都没用,这时必选先定位到相应的frame下,再去定位元素。

 

解决办法:如果iframe有id或者name的情况下

直接就可以用Switch_to_frame(“id值或者name值”)

如果iframe没有id或者name,则参考下面写法

#先定位到iframe

elementi= driver.find_element_by_class_name('APP-editor-iframe')

#再将定位对象传给switch_to_frame()方法

driver.switch_to_frame(elementi) 

如果完成操作后,可以通过switch_to.parent_content()方法跳出当前iframe,或者还可以通过switch_to.default_content()方法跳回最外层的页面。  

 

2.页面加载过慢,还没加载完毕就开始找元素

这个原因影响到因素比较多,至少可以肯定我们需要设置一个等待时间去等待某元素的出现。

解决办法:显式等待

显式等待是针对于某个特定的元素设置的等待时间,如果在规定的时间范围内,没有找到元素,则会抛出异常,如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作。

// 每隔1秒去调用一下until中的函数,默认是0.5秒,如果等待10秒还没有找到元素 。则抛出异常。

WebDriverWait wait = new WebDriverWait(driver, 10, 1);

wait.until(new ExpectedCondition<WebElement>() {

 

@Override
public WebElement apply(WebDriver driver) {
driver.findElement(By.id("kw"));

 

return driver.findElement(By.id("kw"));
}

}).sendKeys("我是一个自动化测试小脚本");

}

 

隐式等待

隐式等待是设置的全局等待,分为页面加载超时等待 ;页面元素加载超时; 异 步脚本超时。

如果是页面元素超时,设置等待时间,是对页面中的所有元素设置加载时间。隐式 等待是其实可以理解成在规定的时间范围内,浏览器在不停的刷新页面,直到找到 相关元素或者时间结束。

 

//页面加载超时时间设置为5s
driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
driver.get("https://www.baidu.com/");
//定位对象时给10s 的时间, 如果10s 内还定位不到则抛出异常
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.findElement(By.id("kw")).sendKeys("隐式等待");
//异步脚本的超时时间设置成3s
driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);

笨方法等待

使当前线程进入等待,Thread.sleep();这种等待属于死等,很容易让线程挂掉,使用程序抛异常,所以我们要慎用此方法。

 

3.动态id定位不到元素:

   对于每次id动态变动的情况,所以推荐使用xpath的相对路径方法查找到该元素。

 

4.firefox不允许跨域调用出现报错

 

解决办法:这是因为firefox安全性强,不允许跨域调用。 Firefox 要取消XMLHttpRequest的跨域限制的话,第一是从 about:config 里设置signed.applets.codebase_principal_support = true;地址栏输入about:config 即可进行firefox设置)
第二就是在open的代码函数前加入类似如下的代码: 

try{ 

 netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); 

    } catch (e) {

alert("Permission UniversalBrowserRead denied.");

 } 

 

5.脚本定位写错

    这个问题就不多做赘述了,特别是xpath写法相对来讲比较长,也容易出现一些路径没理清的问题,建议大家多写多练,掌握不同的定位方式。

 

注:部分写法参考

//  waitForElementPresent locator 等待直到某个元素在页面中存在

//  waitForElementNotPresent locator 等待直到某个元素在页面中不存在

//     

//  waitForTextPresent text 等待直到某个文本在页面中存在

//  waitForTextNotPresent text 等待直到某个文本在页面中不存在

//   

//  waitForText locator text 等待直到locator指定元素内的文本符合text  

//  waitForNotText locator text 等待直到locator指定元素内的文本不符合text

//   

//  waitForVisible locator 等待直到locator指定元素在页面中可见

//  waitForNotVisible locator 等待直到locator指定元素在页面中不可见

//   

//  waitForTitle title 等待直到页面标题符合所指定的title

//  waitForNotTitle title 等待直到页面标题不符合所指定的title

//  waitForLocation url 等待直到页面的地址符合所指定的url

//  waitForNotLocation url 等待直到页面的地址不符合所指定的url

//   

//  waitForValue locator value 等待直到locator指定的元素的value值符合指定的值

//  waitForNotValue locator value 等待直到locator指定的元素的value值不符合指定的值

//   

//  waitForAttribute locator@attr value 等待直到locator指定的元素的attr属性值符合指定的值

//  waitForNotAttribute locator@attr value 等待直到locator指定的元素的attr属性值不符合指定的值

//   

//  waitForChecked locator 等待直到locator指定的radio或checkbox成为选中状态

//  waitForNotChecked locator 等待直到locator指定的radio或checkbox成为非选中状态

//   

//  waitForEditable locator 等待直到locator指定的input或textarea元素可编辑

//  waitForNotEditable locator 等待直到locator指定的input或textarea元素不可编辑

//  waitForXpathCount xpath count 等待直到页面符合xpath的数量为count

//  waitForNotXpathCount xpath count 等待直到页面符合xpath的数量不为count

//    

//  waitForEval script pattern 等待直到script的执行结果符合pattern

//  waitForNotEval script pattern 等待直到script的执行结果不符合pattern  

posted @ 2020-05-16 10:43  仓惶的吞噬时光  阅读(217)  评论(0)    收藏  举报