如何在 android Webview 中输入文字和点击按钮? (c# Xamarin)
How to enter text and click buttons in android Webview? (c# Xamarin)
我的 raspberry pi 上有 mjpg 流媒体 运行,我制作了一个 android 应用程序来观看流媒体,我只是在那里放了一个 webview 并让它导航到我的流媒体URL,但现在我在 mjpg 流媒体上启用了密码功能。当我进入页面时,会弹出一个询问用户名和密码的窗口:
现在我需要我的应用程序以某种方式在我每次打开应用程序时自动输入用户名和密码。
我做了一些研究,我唯一能找到的是用于 C# windows 表单的 Web 浏览器控件:
webBrowser1.Document.GetElementById("username").SetAttribute("value", "supersecretusername");
webBrowser1.Document.GetElementById("Log_in").InvokeMember("click");
但不要认为这些对 android 的网络视图和 javascript 的警报有效。
有没有办法在这些字段中输入用户名和密码并自动单击按钮,或者有没有办法输入一次并以某种方式保存它们??
我还应该提一下,我是编程新手,我的母语不是英语(您可能会说),谢谢。
您发错版块了。你的问题也不是很清楚。这是你的原生程序吗?您可以完全访问源代码吗?
据我了解,您正在寻找的是移动自动化。
查找robot framework and appium。用于移动自动化和测试。 Appium 是 selenium 的移动等价物,而机器人框架只是一个 python 包装器,因此如果您还不知道 python,您实际上不必学习 python。
您可以使用 LoadUrl 方法将 JavaScript 注入您的 WebView。这是它在 Android:
中如何工作的快速示例
1) 获得 WebView 引用后,您需要将 JavaScript 设置为启用
var webBrowser = this.FindViewById<WebView>(Resource.Id.webView1);
webBrowser.Settings.JavaScriptEnabled = true;
2) 要处理加载事件,您需要分配一个 WebViewClient
webBrowser.SetWebViewClient(new Client());
3) 出于演示目的,我创建了一个示例 HTML 页面并从资产中加载它:
webBrowser.LoadUrl("file:///android_asset/main.html");
4) 客户端本身
public class Client : WebViewClient
{
public override void OnPageFinished(WebView view, string url)
{
base.OnPageFinished(view, url);
if (!url.Contains("main.html")) return;
var username = "supersecretusername";
var password = "supersecretpassword";
// to ensure Log_in click isn't called before username & password are set lets
// create the script as single item instead of calling them separately
var script = $"document.getElementById(\"username\").value = \"{username}\";" +
$"document.getElementById(\"password\").value = \"{password}\";" +
"document.getElementById(\"Log_in\").click()";
view.LoadUrl($"javascript: {script}");
// separate calls
//view.LoadUrl("javascript: document.getElementById(\"username\").value = \"sami\";document.getElementById(\"password\").value = \"password\";");
//view.LoadUrl("javascript: document.getElementById(\"password\").value = \"password\"");
//view.LoadUrl("javascript: document.getElementById(\"Log_in\").click()");
}
}
这对我有用 (VS2017):
MainPage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MyApp"
x:Class="MyApp.MainPage"
NavigationPage.HasNavigationBar="False"
Title="My App">
<WebView x:Name="browser" Navigating="OnNavigating" Navigated="OnNavigated"></WebView>
</ContentPage>
MainPage.xaml.cs
using System;
using Xamarin.Forms;
namespace MyApp
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
browser.Source = "..."; // or in xaml
}
// Event when webview has finished change
void OnNavigated(object sender, WebNavigatedEventArgs args)
{
string script = "...;";
browser.EvaluateJavaScriptAsync(script);
}
// ...
}
}
我的 raspberry pi 上有 mjpg 流媒体 运行,我制作了一个 android 应用程序来观看流媒体,我只是在那里放了一个 webview 并让它导航到我的流媒体URL,但现在我在 mjpg 流媒体上启用了密码功能。当我进入页面时,会弹出一个询问用户名和密码的窗口:
现在我需要我的应用程序以某种方式在我每次打开应用程序时自动输入用户名和密码。
我做了一些研究,我唯一能找到的是用于 C# windows 表单的 Web 浏览器控件:
webBrowser1.Document.GetElementById("username").SetAttribute("value", "supersecretusername");
webBrowser1.Document.GetElementById("Log_in").InvokeMember("click");
但不要认为这些对 android 的网络视图和 javascript 的警报有效。
有没有办法在这些字段中输入用户名和密码并自动单击按钮,或者有没有办法输入一次并以某种方式保存它们??
我还应该提一下,我是编程新手,我的母语不是英语(您可能会说),谢谢。
您发错版块了。你的问题也不是很清楚。这是你的原生程序吗?您可以完全访问源代码吗?
据我了解,您正在寻找的是移动自动化。
查找robot framework and appium。用于移动自动化和测试。 Appium 是 selenium 的移动等价物,而机器人框架只是一个 python 包装器,因此如果您还不知道 python,您实际上不必学习 python。
您可以使用 LoadUrl 方法将 JavaScript 注入您的 WebView。这是它在 Android:
中如何工作的快速示例1) 获得 WebView 引用后,您需要将 JavaScript 设置为启用
var webBrowser = this.FindViewById<WebView>(Resource.Id.webView1);
webBrowser.Settings.JavaScriptEnabled = true;
2) 要处理加载事件,您需要分配一个 WebViewClient
webBrowser.SetWebViewClient(new Client());
3) 出于演示目的,我创建了一个示例 HTML 页面并从资产中加载它:
webBrowser.LoadUrl("file:///android_asset/main.html");
4) 客户端本身
public class Client : WebViewClient
{
public override void OnPageFinished(WebView view, string url)
{
base.OnPageFinished(view, url);
if (!url.Contains("main.html")) return;
var username = "supersecretusername";
var password = "supersecretpassword";
// to ensure Log_in click isn't called before username & password are set lets
// create the script as single item instead of calling them separately
var script = $"document.getElementById(\"username\").value = \"{username}\";" +
$"document.getElementById(\"password\").value = \"{password}\";" +
"document.getElementById(\"Log_in\").click()";
view.LoadUrl($"javascript: {script}");
// separate calls
//view.LoadUrl("javascript: document.getElementById(\"username\").value = \"sami\";document.getElementById(\"password\").value = \"password\";");
//view.LoadUrl("javascript: document.getElementById(\"password\").value = \"password\"");
//view.LoadUrl("javascript: document.getElementById(\"Log_in\").click()");
}
}
这对我有用 (VS2017):
MainPage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MyApp"
x:Class="MyApp.MainPage"
NavigationPage.HasNavigationBar="False"
Title="My App">
<WebView x:Name="browser" Navigating="OnNavigating" Navigated="OnNavigated"></WebView>
</ContentPage>
MainPage.xaml.cs
using System;
using Xamarin.Forms;
namespace MyApp
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
browser.Source = "..."; // or in xaml
}
// Event when webview has finished change
void OnNavigated(object sender, WebNavigatedEventArgs args)
{
string script = "...;";
browser.EvaluateJavaScriptAsync(script);
}
// ...
}
}