1、元素定位
—— xpath定位基本解决所有难找的元素
(1)元素属性定位:xpath = "//input[@placeholder='门槛']"
(2)元素文本定位:xpath="//span[text()='确 定']" ,或者包含某文本//span[contains(text()='确 定']
(3)某个节点不好找时,可找到其子节点,通过子节点的父节点来查找:xpath="//div[text()='选择模板']/parent::div"
(4)如果某个元素通过属性查找不是唯一,除了存放list取索引外,可通过获取某个固定的同级节点,通过其节点的所有平级结点来获取:
xpath="//span[text()='领取后 ']/preceding-sibling::span/input"
备注:
1、火狐浏览器插件firepath是查找元素的利器,可通过xpath来判断当前定位方法获取到的位置在页面上有几个,你想要获取的元素是第几个,然后根据list来取当前index下的元素
2、上述(3)(4)方法为使用xpath的轴(Axis)进行元素定位,可以解决大部分难以查找的元素
2、其他常见的问题
(1)有时某个操作之后会跳入一个iframe链接,如下图:
可以先切换到该frame中后才能继续查找到该页面的元素:
driver.switchTo().frame( driver.find_element_by_xpath(" .//*[@id='myIfame']/iframe"));
(2)某些时候元素找正确了,但是直接用selenium封装的click方法一直报错,可以用JavaScriptExecutor单击元素来解决问题(比如操作日历控件时)
((JavascriptExecutor) driver).executeScript("arguments[0].click();",webElement);
(3)web端自动化速度非常快,有时候页面元素定位正确,但就是报错找不到该元素,可以通过设置等待时间来保持代码的稳定性
常用的隐式等待:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
常用的显式等待:
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfElementLocated(WebElement);
(4)调用selenium封装的driver.switchTo.alert() 或 alert.accept()对非JS原生的confirm弹框操作没有效果
解决方法:模拟鼠标键盘操作enter键来确认(同理可模拟键盘上很多其他键,如TAB键等,根据实际需要自行选择
Actions action = new Actions(driver);
action.sendKeys(Keys.ENTER).build().perform();
(5)上传图片最简单的方法:sendKeys(文件路径),但是注意一定要定位到input标签上,而不是div上,否则会报错:cannot fouse element(因为div不支持输入sendKeys)