解决方案 »

  1.   

    本帖最后由 showbo 于 2014-07-11 11:24:26 编辑
      

  2.   


    我已经附带了会话对应的cookieid,但是页面的js中有“if(self == top) parent.location='login.jsp”这个的限制,self每次和top是一样的,每次都从这里返回了。self==top的原因,是因为我通过程序post数据,而不是通过浏览器已有的页面点击发送的。这个判断条件或许就是为了阻止我这种不通过页面直接post数据的情况。
    现在不知道有没有其他办法来解决。
      

  3.   

    http://bbs.csdn.net/topics/50209868
    问题和这个一样,但是没有给出解决方法
      

  4.   

    问题的完整描述:
    整个网站使用了框架使其便于导航和统一风格,它不希望框架中的子页面被用户单独浏览访问到~,当子页面在任何时间出现时都要处在一个本网站的框架页面中,不能单独被调用,要是单独调用,则自动跳转到login.js页面了 。针对这种问题,有解决办法么?我想到的方法:
    C#调用超链接的js回调(相当于模拟鼠标点击的过程),将子页面生成在框架页面中,然后针对子页面的超链接进行同样的鼠标模拟点击,最后提交订单。不知是否可行?
      

  5.   

    C#调用超链接的js,将子页面生成在框架页面中document.getElementById('子页面id').src = '子页面链接';关于子页面提交订单,参考: 用iframe进行表单提交时的若干问题总结
      

  6.   

    在webbrowser中,鼠标移到超链接上,会显示“javascript:parent.beder("ft","hrou","gid=1700350&strong=&rtype=&gnum=60004"”,
    后来我执行webBrowser1.Navigate(code),子页面会生成,和人工点击超链接生成的位置一模一样,本来以为已经可以了,但是在提交订单的时候,还是提示(self == top) parent.location='login.jsp'。
    这样说明,通过webBrowser1.Navigate(code)生成的子页面还没有在对应框架里面。
    有什么办法可以生成在框架页面中吗?
      

  7.   

    你的判断本身就有问题
    self == top 表示的是页面不在框架中,也就是单独显示了
    既然是单独的页面,当然也就没有 parent 了。你对 parent 赋值,自然就错了
    if(self == top) location='login.jsp'
    这样就可以了
      

  8.   


    (self == top) parent.location='login.jsp'是网站页面的代码,我是用C#来提交订单,由于生成的页面是单独显示的,就执行了这句代码,它本身没有问题的。
    现在问题是我怎样才能使得我生成的页面放到对应的框架中。
      

  9.   


    该怎么指定表单的target?
    string scriptstr = “javascript:parent.beder(\"ft\",\"hrou\",\"gid=1700350&strong=&rtype=&gnum=60004\"”;
    webBrowser1.Navigate(scriptstr );我的代码只有这两句,生成了页面,而且这个页面也在框架中对应的位置(这个位置和手动点击生成页面的位置是一样的)。
      

  10.   

    首先,如果你需要子页面转到新的地址,那么使用this.webBrowser1.Document.Window.Frames["子页名"].Navigate("需要转到的地址");但是新地址必须是合法的url,直接Navigate到javascript可能不行,自己试一下。
    其次,你可以模拟鼠标点击超链接//获取子页面的Document对象
    HtmlDocument doc = this.webBrowser1.Document.Window.Frames["子页名"].Document;
    //获取超链接节点
    HtmlElement el = doc.GetElementById ("超链接ID");
    //模拟点击
    el.InvokeMember("click");第三,你可以直接模拟执行子页面的javascript代码string scriptstr = "parent.beder(\"ft\",\"hrou\",\"gid=1700350&strong=&rtype=&gnum=60004\"";
    string result = sendJS(webBrowser1, scriptstr);其中sendJS函数为private string sendJS(WebBrowser sender, string JScript) {
    object[] args = {JScript};
    return sender.Document.Window.Frames["子页名"].Document.InvokeScript("eval",args).ToString();
    }以为你提到使用WebBrowser控件,所以提供上面的方法。
    如果你是想自动化的话,也可以看看使用HttpWebRequest。该怎么指定表单的target?
    string scriptstr = “javascript:parent.beder(\"ft\",\"hrou\",\"gid=1700350&strong=&rtype=&gnum=60004\"”;
    webBrowser1.Navigate(scriptstr );我的代码只有这两句,生成了页面,而且这个页面也在框架中对应的位置(这个位置和手动点击生成页面的位置是一样的)。
      

  11.   


    <frameset rows="71,*" cols="*" border="0" frameBorder="NO" frameSpacing="0">
    <frame name="header" src="header.jsp" scrolling="no" noresize="noresize">
    <frameset cols="241,*" border="0" frameBorder="NO" frameSpacing="0" >
    <frame name="mem_order" src="select.jsp" scrolling="no" noresize="noresize">
    <frame name="body" src="browser.jsp" scrolling="no" noresize="noresize">
    </frameset>
    </frameset>主页的三个frame,子页面归属于mem_order,
    我尝试第一种方法,虽然页面出现了,但是提交订单时,还提示和上面说的一样的报错:
    string scriptstr = “javascript:parent.beder(\"ft\",\"hrou\",\"gid=1700350&strong=&rtype=&gnum=60004\"”;
    this.webBrowser1.Document.Window.Frames["mem_order"].Navigate(scriptstr );不知道scriptstr 是不是要用子页面的url(这个url可以通过抓包工具获得)。
      

  12.   


    如果使用url,还是有问题,frame都被子页面占据了,其他的页面都不见了,而这个子页面只是frame的中的一部分。
      

  13.   

    HttpWebRequest最早就尝试过了,也是在最后提交订单的时候,子页面是单独存在的,导致失败了。通过webbrowser来操作,这种情况应该会比较常见吧,该怎么解决啊
      

  14.   

    关于设置target="_self"强制在自身窗体打开的方法,请参考: http://hi.baidu.com/tjdnzishzdgtuxe/item/fe09ff17d188297b7b5f25e1C# WebBrowser强制使新窗口网页只在WebBrowser打开
      

  15.   

    其实我也很奇怪的,因为httpwebrequest不会触发javascript,而你的说子页面是单独存在的导致失败了。
    你把self==top去掉,看看有没有其他的代码影响在webbrowser或httpwebrequst提交。
      

  16.   


    self==top 是在网页里面的js代码,我还改不了。尝试了另一种方法就可以了,也就是你之前说的,即分析网页模拟鼠标点击//获取子页面的Document对象
    HtmlDocument doc = this.webBrowser1.Document.Window.Frames["子页名"].Document;
    //获取超链接节点
    HtmlElement el = doc.GetElementById ("超链接ID");
    //模拟点击
    el.InvokeMember("click");最早这样试了不成功,是因为这个网页是多层嵌套,代码只用了一层,而且是个动态网页,我以为动态网页是获取不到页面内容的(新手的观点)。其实只要在客户端页面上能够显示的内容,基本上都是可以获取的。谢谢大家的回帖和帮助。