在我的测试网页中,我必须上传文件,上传器是基于Flash的。我使用AutoIT上传文件,但我的问题是我无法点击添加按钮,以便上传对话框显示和autoIT可以完成它的工作..
driver.findElement(By.xpath(“HTML /体/格[3] / DIV [2] / DIV / DIV /表/ tbody的/ TR [2] / TD / DIV /形式/ DIV / DIV [6 ] / DIV [1] / DIV [2] /对象“))点击();
错误即时获取元素未找到错误.. 你们可以帮助我点击那个闪光按钮吗?我甚至使用过Firepath,Css,我不知道该怎么做。 Plz帮助
谢谢
答案 0 :(得分:1)
你不能使用Selenium自动化flash对象,它是方式超出Selenium可以做的范围。
您需要编辑AutoIT脚本以单击“添加”按钮,Selenium将无法为您执行此操作。
答案 1 :(得分:1)
虽然这个答案与Selenium无关,但我认为这可能有助于其他人寻找这个问题的答案。
我之前和之后都处于这种状况,而且不能使用Selenium来点击"在一个闪光按钮上,点击该按钮并且继续按照您需要做的事情进行操作时,有一些不太好的东西。
网页上的任何Flash影片都像其他任何窗口一样,只是不能像其他任何元素那样容易访问,但是如果你去了那么低的"足够你可以枚举属于该浏览器实例的窗口并找到闪存窗口。
所以这个想法如下:
查找活动的浏览器实例(IE,FF,Chrome等,在本例中为IE)
var ps = Process.GetProcessesByName("iexplore").Select(p => p.Id);
foreach (var handle in ps.SelectMany(EnumerateProcessWindowHandles))
{
GetChildWindows(handle);
if (_macromediaFound != false){break;}
}
列出所有子窗口(使用Windows API EnumerateWindowsEx)
public static List<IntPtr> GetChildWindows(IntPtr parent)
{
List<IntPtr> result = new List<IntPtr>();
GCHandle listHandle = GCHandle.Alloc(result);
try
{
EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
}
finally
{
if (listHandle.IsAllocated)
listHandle.Free();
}
return result;
}
找到具有名为MacromediaFlashPlayerActiveX的ClassName的Window的窗口(这是在IE中)
以前的代码每次在步骤1的每个进程上找到子窗口时都会调用函数(方法)EnumWindow
private static bool EnumWindow(IntPtr handle, IntPtr pointer)
{
StringBuilder message = new StringBuilder(1000);
SendMessage(handle, WmGettext, message.Capacity, message);
StringBuilder classN = new StringBuilder(1000);
GetClassName(handle, classN, classN.Capacity);
if (classN.ToString().Contains("MacromediaFlashPlayerActiveX"))
{ // continues below....
根据该信息,您将拥有窗口的XY位置,并且您需要找到正确的XY以点击屏幕上的按钮。
Thread.Sleep(2000); // this will allow any needed time to actually draw the flash on screen
Rectangle rect = new Rectangle();
GetWindowRect(handle, ref rect);
var oldPos = Cursor.Position;
Point clientPoint = new Point(rect.X + 20, rect.Y + 10); // In this particular Flash Movie the Upload File button is 20 points from x and 10 points from Y)
if (rect.X != 0 && rect.Y != 0)
{
Cursor.Position = new Point(clientPoint.X, clientPoint.Y);
}
向这些坐标发送点击事件
mouse_event(MouseEventfLeftdown, 0, 0, 0, UIntPtr.Zero);
mouse_event(MouseEventfLeftup, 0, 0, 0, UIntPtr.Zero);
Thread.Sleep(2000);
// Options but "clean" return the mouse to it's original position
Cursor.Position = oldPos;
点击发送后,找一个ClassName#32770的窗口(至少用IE浏览器)
hwndTmp = (IntPtr)FindWindow("#32770", "Text of the upload window");
从这里继续这个过程应该非常简单。
我知道这不是最干净的解决方案(你需要一个登录用户,并且还有一个屏幕来获取坐标)但我知道有一些事实是有没有替代方案,你需要找到解决方案。
希望这有帮助。
答案 2 :(得分:0)
可以使用FlashSelenium
完成