让我们看一下通过Python Selenium WebDriver执行JavaScript语句的几种不同方法。
在本教程中,让我们分析Selenium WebDriver中使用最少但功能最强大的功能。是的,我将讨论JavaScript执行器,并向您展示通过Python Selenium WebDriver执行JavaScript语句的几种不同方法。
可能会发生这种情况,在某些实时项目中,Selenium WebDriver无法对特定的Web元素执行操作。例如,由于WebDriver模拟最终用户交互,因此很自然地会拒绝单击最终用户看不到的元素(有时即使Web元素在页面上可见,也会发生这种情况)。可能有其他几个类似的原因或情况。
在这些情况下,我们可以依靠JavaScript来单击或对该Web元素执行操作,并且可以通过WebDriver执行这些JavaScript语句。
您可以使用JavaScript执行WebElement界面所做的所有操作。
什么是JavaScript?
JavaScript是一种脚本语言,它在客户端运行,即在浏览器上运行,并且当您浏览网页时会做一些神奇的事情。有关更多详细信息,请在DZone上搜索关键字“JavaScript”。
我们如何在WebDriver中使用JavaScript?
Python Selenium WebDriver提供了一个内置方法:
driver.execute_script("some javascript code here");
我们可以通过两种方式在浏览器中执行JavaScript。
方法1:在文档根级别执行JavaScript
在这种情况下,我们使用JavaScript提供的方法捕获我们想要使用的元素,然后在其上声明一些操作并使用WebDriver执行此JavaScript。
例:
javaScript = "document.getElementsByName('username')[0].click();"
driver.execute_script(javaScript)
我们在这里做什么?
第1步:我们正在使用JavaScript检查并通过属性“名称”获取元素。(另外,可以使用'id'和'class'属性。)
第2步:使用JavaScript声明并对元素执行单击操作。
第3步:调用execute_script()方法并将我们创建的JavaScript作为字符串值传递。
请注意 上面[0] 的 getElementsByName('username')[0] 声明。JavaScript函数 getElementsByName , getElementsByClassName 等返回所有匹配的元件的阵列。在我们的例子中,我们需要对可以通过的第一个匹配元素进行操作 index [0] 。如果您知道自己在做什么,即,如果您知道要操作的元素的索引,则可以直接使用索引,例如 getElementsByName('username')[2] 。
但是,如果您使用的是JavaScript函数' getElementById ',则不需要使用任何索引,因为它只返回一个元素('id'应该是唯一的)。
执行时,WebDriver会将JavaScript语句注入浏览器,脚本将执行该任务。在我们的示例中,它对目标元素执行单击操作。此JavaScript具有自己的命名空间,不会干扰实际网页中的JavaScript。
方法2:在元素级别执行JavaScript
在这种情况下,我们使用WebDriver捕获我们想要使用的元素,然后使用JavaScript在其上声明一些操作,并通过将web元素作为参数传递给JavaScript来使用WebDriver执行此JavaScript。
这令人困惑吗?让我们分解吧。
例如:
userName = driver.find_element_by_xpath("//button[@name='username']")
driver.execute_script("arguments[0].click();", userName)
我们在这里做什么?
第1步:
使用WebDriver提供的方法检查和捕获元素,例如'find_element_by_xpath ':
userName = driver.find_element_by_xpath("//button[@name='username']")
第2步:
使用JavaScript声明并对元素执行单击操作:
arguments[0].click()
第3步:
execute_script() 使用我们创建的JavaScript语句作为字符串值调用 方法,并使用WebDriver作为参数捕获Web元素:
driver.execute_script("arguments[0].click();", userName)
上面两行代码可以缩短为下面的格式,我们使用WebDriver找到一个元素,声明一些JavaScript函数,并使用WebDriver执行JavaScript。
driver.execute_script("arguments[0].click();",
driver.find_element_by_xpath("//button[@name='username']"))
更频繁面临的另一个问题是需要滚动到网页的底部。您可以在一行代码中执行此操作:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
此外,您的语句中可以有多个JavaScript操作。
例如:
userName = driver.find_element_by_xpath("//button[@name='username']")
password = driver.find_element_by_xpath("//button[@name='password']")
driver.execute_script("arguments[0].click();arguments[1].click();", userName, password)
在这种情况下,web元素的顺序的使用很重要。访问 index 与 [0] 一个JavaScript语句中的任何位置将检索传递的第一个网页元素。
driver.execute_script("arguments[1].click();arguments[0].click();", userName, password)
如何返回值
JavaScript执行程序的另一个重要方面是它可用于从Web元素中获取值。这意味着该 execute_script() 方法可以返回值。
例如:
print driver.execute_script('return document.getElementById("fsr").innerText')
请注意,如果您想要JavaScript代码返回的内容,则需要使用return。此外,可以使用Selenium定位元素并将其传递到脚本中。
什么元素找不到会发生什么?
当JavaScript找不到要操作的元素时,它会抛出带有相应错误消息的WebDriver异常。
场景1:
我们正在尝试使用' print driver.execute_script('return document.getElementById("fsr").innerText') ' 来读取属性, 但网页中没有这样的元素。我们在异常跟踪中收到以下消息:
selenium.common.exceptions.WebDriverException: Message: unknown error: Cannot read property 'innerText' of null
场景2:我们试图在JavaScript中使用无效的操作或错误函数名称,例如' print driver.execute_script('document.getElementById("fsr").clic();') '。(注意click() 方法名称中的拼写错误 。)
selenium.common.exceptions.WebDriverException: Message: unknown error: document.getElementById(...).clic is not a function
摘要
以下是可以使用JavaScript的一些潜在操作的摘要。
获取元素文本或属性
找到一个元素
对元素做一些操作,比如 click()
更改元素的属性
滚动到网页上的元素或位置
等到页面加载完毕
使用Selenium处理DOM时,JavaScript的基本知识有很大帮助。