我们如何确定何时在 selenium c# 中使用 JavaScriptExecutor?
How can we determine when to use JavaScriptExecutor in selenium c#?
TestInChrome1 抛出异常 - "OpenQA.Selenium.ElementNotInteractableException: element not interactable" 但是,当在 TestInChrome2 中使用 JavaScriptExecutor 时,它运行良好。
我的问题是:
为什么 Click() 方法在 TestInChrome1 中不起作用?
不经过反复试验,如何确定JavaScriptExecutor是必须的?
[TestMethod]
public void TestInChrome1()
{
IWebDriver driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://ultimateqa.com/");
IWebElement element = driver.FindElement(By.TagName("title"));
element.Click();
driver.Quit();
}
[TestMethod]
public void TestInChrome2()
{
IWebDriver driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://ultimateqa.com/");
IWebElement element = driver.FindElement(By.TagName("title"));
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string title = (string)js.ExecuteScript("return document.title");
driver.Quit();
}
当我们使用 selenium 时,它编写的方法试图模拟用户与网页的交互方式。
所以,让我们假设屏幕上有一个按钮,但它从未显示在屏幕的可见区域。也许它不可滚动(或者它可能总是隐藏的)并且永远不会对用户可用。现在这是一个有效的错误。
- 如果您使用 javascript 执行器,它会点击按钮,您的脚本将无法捕捉到这个问题
- 如果您使用 selenium 方法进行点击,脚本将失败并给您一些异常
就我而言,我在大多数误报(无效、非错误)场景中遇到了 Element not interactable 异常
- 如果屏幕上的某些字段之前处于非活动状态,您执行了一些操作它会变为活动状态。但由于执行速度更快,当脚本与它交互时它仍然处于非活动状态
- 假设您在屏幕上有下拉菜单,您展开下拉菜单并单击某个字段。现在您在下拉菜单关闭时单击其他字段。虽然执行下拉菜单不会立即关闭,并且您要访问的下一个元素被该下拉菜单遮挡(可能发生在弹出窗口或在屏幕、组合框、搜索框上展开的某些元素)
如果你看到太多由于元素不可交互导致的问题,只需捕获这个异常,截图供你参考,自己在日志中生成警告,你可以使用 javascript executor in catch 实现直接点击堵塞。
至少通过为自己生成警告,您可以检查您是否没有遗漏实际问题。
希望这对您有所帮助。
所有 HTML 文档都需要 <title>
标签,它定义了文档的标题。元素:
- 定义浏览器工具栏中的标题。
- 添加到收藏夹时为页面提供标题。
- 在 search-engine 结果中显示页面标题。
Note A: You can NOT have more than one element in an HTML document.
Note B: If you omit the <title>
tag, the document will not validate as HTML.
如果您观察 HTML DOM of any website e.g. https://ultimateqa.com/,您将观察到 <title>
位于 <head>
中。因此这个标签的信息是 visible 和 readable 但不是 interactable.
TestInChrome1()
所以根据上面的讨论,在 TestInChrome1()
:
您将无法在标题标签上调用 Click()
。
要提取标题,您可以使用Title property from IWebDriver接口,您可以使用以下解决方案:
Console.WriteLine(driver.Title);
TestInChrome2()
现在你一定知道Selenium beside allowing users to simulate common activities performed by end-users, entering text into fields, selecting drop-down values and checking boxes, and clicking links in documents, it also provides many other controls such as arbitrary JavaScript execution. To extract the <title>
you can use the ExecuteScript()
method from IJavaScriptExecutor界面如下:
Console.WriteLine((string)((IJavaScriptExecutor)driver).ExecuteScript("return document.title"));
TestInChrome1 抛出异常 - "OpenQA.Selenium.ElementNotInteractableException: element not interactable" 但是,当在 TestInChrome2 中使用 JavaScriptExecutor 时,它运行良好。
我的问题是:
为什么 Click() 方法在 TestInChrome1 中不起作用?
不经过反复试验,如何确定JavaScriptExecutor是必须的?
[TestMethod] public void TestInChrome1() { IWebDriver driver = new ChromeDriver(); driver.Navigate().GoToUrl("https://ultimateqa.com/"); IWebElement element = driver.FindElement(By.TagName("title")); element.Click(); driver.Quit(); } [TestMethod] public void TestInChrome2() { IWebDriver driver = new ChromeDriver(); driver.Navigate().GoToUrl("https://ultimateqa.com/"); IWebElement element = driver.FindElement(By.TagName("title")); IJavaScriptExecutor js = (IJavaScriptExecutor)driver; string title = (string)js.ExecuteScript("return document.title"); driver.Quit(); }
当我们使用 selenium 时,它编写的方法试图模拟用户与网页的交互方式。
所以,让我们假设屏幕上有一个按钮,但它从未显示在屏幕的可见区域。也许它不可滚动(或者它可能总是隐藏的)并且永远不会对用户可用。现在这是一个有效的错误。
- 如果您使用 javascript 执行器,它会点击按钮,您的脚本将无法捕捉到这个问题
- 如果您使用 selenium 方法进行点击,脚本将失败并给您一些异常
就我而言,我在大多数误报(无效、非错误)场景中遇到了 Element not interactable 异常
- 如果屏幕上的某些字段之前处于非活动状态,您执行了一些操作它会变为活动状态。但由于执行速度更快,当脚本与它交互时它仍然处于非活动状态
- 假设您在屏幕上有下拉菜单,您展开下拉菜单并单击某个字段。现在您在下拉菜单关闭时单击其他字段。虽然执行下拉菜单不会立即关闭,并且您要访问的下一个元素被该下拉菜单遮挡(可能发生在弹出窗口或在屏幕、组合框、搜索框上展开的某些元素)
如果你看到太多由于元素不可交互导致的问题,只需捕获这个异常,截图供你参考,自己在日志中生成警告,你可以使用 javascript executor in catch 实现直接点击堵塞。 至少通过为自己生成警告,您可以检查您是否没有遗漏实际问题。
希望这对您有所帮助。
所有 HTML 文档都需要 <title>
标签,它定义了文档的标题。元素:
- 定义浏览器工具栏中的标题。
- 添加到收藏夹时为页面提供标题。
- 在 search-engine 结果中显示页面标题。
Note A: You can NOT have more than one element in an HTML document.
Note B: If you omit the
<title>
tag, the document will not validate as HTML.
如果您观察 HTML DOM of any website e.g. https://ultimateqa.com/,您将观察到 <title>
位于 <head>
中。因此这个标签的信息是 visible 和 readable 但不是 interactable.
TestInChrome1()
所以根据上面的讨论,在 TestInChrome1()
:
您将无法在标题标签上调用
Click()
。要提取标题,您可以使用Title property from IWebDriver接口,您可以使用以下解决方案:
Console.WriteLine(driver.Title);
TestInChrome2()
现在你一定知道Selenium beside allowing users to simulate common activities performed by end-users, entering text into fields, selecting drop-down values and checking boxes, and clicking links in documents, it also provides many other controls such as arbitrary JavaScript execution. To extract the <title>
you can use the ExecuteScript()
method from IJavaScriptExecutor界面如下:
Console.WriteLine((string)((IJavaScriptExecutor)driver).ExecuteScript("return document.title"));