java+selenium 对隐藏的元素进行操作失败 解决错误element not interactable

如下图登录功能,大部分都是在登录等功能上,需要点击登录后才浮现一个登录面板,此为隐藏的div,里面的input,button都是隐藏元素,针对隐藏元素,是可以定位到的,但是。。。。。。。。。。不能进行操作,操作元素包含click(),sendkeys()等功能,会报错如果报错误element not interactable  网上有些解释说隐藏元素不可以操作,要用js的方式(这个说法有点错误),虽然js确实可以,但是实际上很多问题不用js方式也可以处理

首先检查是否唯一

很多情况之所以能定位但是不能操作是因为,.页面上不止有唯一的元素.你可以用findElements的方式查找,肯定不是唯一的,但是由于你用findElement。所以只能获取到1个,并且刚好只获取到那个隐藏的不可执行的,所以才操作不来。

那如何确定唯一呢,用ctr+shift+I  调出开发者模式,在console模块那里,输入js查找方式。

例如:document.getElementById(“sds”)这只能查找一个

          document.getElementsByClassName  这个就可以查找多个

java+selenium 对隐藏的元素进行操作失败 解决错误element not interactable_第1张图片

如下图,输入脚本后,回车,点开查找结果,length显示为1就是只查找到唯一结果

java+selenium 对隐藏的元素进行操作失败 解决错误element not interactable_第2张图片

然后进行显示和等待时间,再操作

 

隐藏元素

如下图有个输入框和一个登录的按钮,本来是显示的

java+selenium 对隐藏的元素进行操作失败 解决错误element not interactable_第3张图片

元素的属性隐藏和显示,主要是type="hidden"style="display: none;"属性来控制的,接下来在元素属性里面让它隐藏

java+selenium 对隐藏的元素进行操作失败 解决错误element not interactable_第4张图片

如何定位隐藏元素

定位隐藏元素和普通的元素没啥区别

		// 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");

java+selenium 对隐藏的元素进行操作失败 解决错误element not interactable_第5张图片

  或者:,直接用js赋值

   String inputName = "document.getElementById('loginname').setAttribute('value', 'text')";

     js.executeScript(inputName);

注意事项

在输入账号后,立马输入密码,出现错误

java+selenium 对隐藏的元素进行操作失败 解决错误element not interactable_第6张图片

两个操作之间时间太短,容易造成账户密码连接在一起了,所以要先推辞下再去输入密码

    Thread.sleep(50);

  再去进行输入密码操作

最后登录成功

java+selenium 对隐藏的元素进行操作失败 解决错误element not interactable_第7张图片

你可能感兴趣的:(selenium+java)