python selenium 执行js_在Python Selenium WebDriver中使用JavaScript执行操作

让我们看一下通过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的基本知识有很大帮助。

你可能感兴趣的:(python,selenium,执行js)