如下图登录功能,大部分都是在登录等功能上,需要点击登录后才浮现一个登录面板,此为隐藏的div,里面的input,button都是隐藏元素,针对隐藏元素,是可以定位到的,但是。。。。。。。。。。不能进行操作,操作元素包含click(),sendkeys()等功能,会报错如果报错误element not interactable 网上有些解释说隐藏元素不可以操作,要用js的方式(这个说法有点错误),虽然js确实可以,但是实际上很多问题不用js方式也可以处理
很多情况之所以能定位但是不能操作是因为,.页面上不止有唯一的元素.你可以用findElements的方式查找,肯定不是唯一的,但是由于你用findElement。所以只能获取到1个,并且刚好只获取到那个隐藏的不可执行的,所以才操作不来。
那如何确定唯一呢,用ctr+shift+I 调出开发者模式,在console模块那里,输入js查找方式。
例如:document.getElementById(“sds”)这只能查找一个
document.getElementsByClassName 这个就可以查找多个
如下图,输入脚本后,回车,点开查找结果,length显示为1就是只查找到唯一结果
如下图有个输入框和一个登录的按钮,本来是显示的
元素的属性隐藏和显示,主要是type="hidden"
和style="display: none;"
属性来控制的,接下来在元素属性里面让它隐藏
定位隐藏元素和普通的元素没啥区别
// Login 功能 多种定位方式------------
// driver.findElement(By.linkText("登录")).click();连接文本方式
//driver.findElement(By.partialLinkText("首页")).click(); 模糊连接文本方式
// driver.findElement(By.id("loginname")).click();id方式
// driver.findElement(By.className("ef")).click();class方式
// driver.findElement(By.name("loginname")).click();name方式
// driver.findElement(By.tagName("input")).sendKeys("13437868119");tag
// driver.findElement(By.xpath("//*[@id=\"loginname\"]")).sendKeys("13437868119");Xpath 定位
driver.findElement(By.cssSelector("#loginname")).sendKeys("13437868119");
隐藏元素可以正常定位到,只是不能操作(定位元素和操作元素是两码事,很多初学者傻傻分不清楚),操作元素是click,clear,send_keys这些方法
如果报错误element not interactable
大部分有2个原因可以解决:3步
1.没有先让div面板显示出来,所以不能操作元素(这里注意了,不是定位不到元素,是操作不到元素),通过点击登录按钮,把div登录面板显示出来
driver.findElement(By.xpath("/html/body/div[3]/div/div[2]/div[1]/div[3]/span[1]")).click();
2.设置睡眠时间(有3种等待方式,到时再贴出来)
Thread.sleep(50);
sleep(long millis) 线程睡眠 millis 毫秒 1000毫秒=1秒 所以在这里可以尽量写大写,如果写成Thread.sleep(5); 是很有可能失败,python中的time.sleep(5)就真的是睡眠5秒 所以别搞混了
3下面要开始操作元素了
方法一:(大部分这个就够用了)
WebDriverWait wait = new WebDriverWait(driver, 3000);最大等待3秒时间
driver.findElement(By.id("loginname")).sendKeys("13437868119");
操作方法二:一般前面方法就够了,实在不行,js 方式要 改变input的属性值,再去直接赋值
String inputName="document.getElementById('loginname').setAttribute('type', 'text')";
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript(inputName);
driver.findElement(By.id("loginname")).sendKeys("13437868119");
或者:,直接用js赋值
String inputName = "document.getElementById('loginname').setAttribute('value', 'text')";
js.executeScript(inputName);
在输入账号后,立马输入密码,出现错误
两个操作之间时间太短,容易造成账户密码连接在一起了,所以要先推辞下再去输入密码
Thread.sleep(50);
再去进行输入密码操作
最后登录成功