章节十四、3-执行JavaScript命令

一、网页页面都是由html+css和javaScript组成的,如果页面中没有javaScript的存在,就不会有操作动作的执行,例如页面上你点击的按钮或者链接都离不开javaScript。(这一节不是为了讲javaScript的知识,对javaScript感兴趣的同学可以自己去网上找资料学习)。

二、如何用javaScript打开百度页面,并定位百度搜索输入框输入值?

 1 package basicweb;
 2 
 3 import java.util.concurrent.TimeUnit;
 4 
 5 import org.junit.jupiter.api.AfterEach;
 6 import org.junit.jupiter.api.BeforeEach;
 7 import org.junit.jupiter.api.Test;
 8 import org.openqa.selenium.By;
 9 import org.openqa.selenium.JavascriptExecutor;
10 import org.openqa.selenium.WebDriver;
11 import org.openqa.selenium.WebElement;
12 import org.openqa.selenium.chrome.ChromeDriver;
13 
14 class JavaScriptExecution {
15     
16     WebDriver driver;
17     String url;
18 //    声明一个私有的JavascriptExecutor变量
19     private JavascriptExecutor js;
20 
21     @BeforeEach
22     void setUp() throws Exception {
23         driver = new ChromeDriver();
24         url = "https://www.baidu.com/";
25 //        把driver强制转换成JavascriptExecutor类型
26         js = (JavascriptExecutor)driver;
27         driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
28         driver.manage().window().maximize();
29     }
30     
31     @Test
32     void test() throws InterruptedException {
33 //        driver.get(url);
34 //        通过javaScript打开网站
35         js.executeScript("window.location = 'https://www.baidu.com/';");
36         
37 //        在这里加入等待为了防止通过javascript打开网站后,会立即查找元素,而这个时候可能页面还没有加载完成,元素未被查找到,程序就会报错。   
38 //        而driver.get();会默认等到网站加载完成再执行下面的操作,所以上面的章节中不需要使用强制等待。
39         Thread.sleep(3000);
40         
41         
42 //        WebElement text = driver.findElement(By.id("kw"));
43 //        通过javaScript查找搜索输入框元素,因为我们需要返回元素,所以需要使用return
44 //        javaScript中没有By.name,By.Xpath等查找元素的方式,只有Byid,ByTagName,ByName,ByClassName,ByTagName,ByName,ByClassNameu返回的是多个元素,获取的是元素组
45 //        因为.getElementBy**('')返回的是object类型的元素,因此需要转型
46         WebElement text = (WebElement)js.executeScript("return document.getElementById('kw');");
47         text.sendKeys("test");
48     }
49 
50     @AfterEach
51     void tearDown() throws Exception {
52         Thread.sleep(2000);
53         driver.quit();
54     }
55 }

三、注意事项

1、javaScript中没有By.name,By.Xpath等查找元素的方式,只有ById,ByTagName,ByName,ByClassName,ByTagName,ByName,ByClassNameu返回的是多个元素,获取的是类数组。

document.getElementById();//id
document.getElementsByTagName();//标签名;Elements加了S,选出来是类数组;
document.getElementsByName();//name属性,部分标签可以;Elements加了S,选出来是类数组;
document.getElementsByClassName();//class;Elements加了S,选出来是类数组;IE9以下不支持;

2、使用Javascript进行操作时,需要driver(浏览器对象)强制转换成JavascriptExecutor类型。

3、使用Javascript进行操作打开网页时,为了防止出现页面未加载完成而导致查找元素失败的情况出现,我们需要在进入页面后最好加上强制等待。

4、因为.getElementBy**('')查找的元素返回的是object类型的元素,因此需要转型,这里是webElement类型的所以需要用WebElement类型的来接收返回的值,如果是其它类型的变量则需要用相对应的类型来接收。

 

如果有不明白的小伙伴可以加群“555191854”问我,群里都是软件行业的小伙伴相互一起学习。

原文地址:https://www.cnblogs.com/luohuasheng/p/10918044.html