这里持续记录学习中遇到的问题,便于以后再遇到后查阅
1.定位带空格的复合class属性,一般使用 css selector来定位
例如:如下属性,其中包含空格
class="s-top-left-new s-isindex-wrap"
如果使用classname定位该元素 "element=web.find_element_by_class_name('s-top-left-new s-isindex-wrap')" 会报错:
no such element: Unable to locate element: {"method":"css selector","selector":".s-top-left-new s-isindex-wrap"}
(Session info: chrome=99.0.4844.51)
要使用css selector定位:
element=web.find_element_by_css_selector('[class="s-top-left-new s-isindex-wrap"]')
2.加载loading元素
很多时候,页面还未加载完成时,页面出现一个动态提示"加载中",等页面全部加载完成,自动消失,在出现该提示时,会遮挡页面其他元素,导致定位其他元素报错,因此需要判断"加载中"是否已经消失后再去定位页面元素
像是这种快速闪过的元素,怎么定位?
需要在他出现时,调用driver.getPageSource()方法来获取页面所有元素,获取到页面所有元素,根据关键字 找到该控件后,再定位
3.定位下拉框
(1)定位seclect标签 下拉框:
如下所示,select标签的下拉框
<select value="xxxx" type=1>
<option value="待确认">待确认</option>
<option value="退款中">退款中</option>
<option value="待结算">待结算</option>
</select>
定位select标签下拉框元素 可以使用Select类,根据元素value、索引、text内容来进行定位:
Select select = new Select(driver.findElement("xxxx"));
// 通过index进行选择
select.selectByIndex(1)
// 通过value进行选择
select.selectByValue("待确认)
// 通过选项文字进行选择
select.selectByVisibleText("待确认")
(2)定位非 select标签下拉框:
很多时候下拉框没有使用Select标签,而是使用ul
<ul class="el-xxxx">
<li class="el-select-drop"><span>待确认</span></li>
<li class="el-select-drop"><span>待结算</span></li>
<li class="el-select-drop"><span>已完成</span></li>
</ul>
需要定位到下拉框,拉到下拉框里的所有元素,再根据索引定位
WebElement el = findElement(By.cssSelector("xxxxxxx"));
List<WebElement> els = el.findElements(By.className("el-select-drop"));
//选择第二个元素
els.get(1).click();
(3)定位检索式 下拉框,输入关键字,检索出元素再选择
一般我们先定位到该输入框,输入关键字,键盘按 下键,选中该元素,点击回车
这里 输入的关键字 尽量不要使用模糊匹配 而是输入想要选中的元素全称,避免选中其他元素
//找到输入框,并输入关键字
findElement(By.xpath("//*[xxxxx]")).sendKeys("检索关键字");
//按键盘下键 选中检索出来的元素
actions().sendKeys(Key.DOWN).perform();
//按键盘 回车
actions().sendKeys(Key.ENTER).perform();
(4)python+pytest 元素定位报:InvalidSelectorException
出现这个错误为无效选择器,这里我是用来获取元素 text的
self.get_element(By.XPATH, r'//h3[@class="flex-center"]/text()')
应该为:去掉'text()'
self.get_element(By.XPATH, r'//h3[@class="flex-center"]')