java如何拿到网页游戏句柄

0

在Java中,获取网页游戏句柄通常涉及到两个主要步骤:网络请求和解析HTML。因为网页游戏通常使用JavaScript进行客户端交互,所以Java直接无法获取到游戏的句柄。但是,你可以使用一些工具和技术来间接实现这个目标。

1. 网络请求:使用Java的HttpURLConnection或第三方库如OkHttp、Apache HttpClient等发送HTTP请求,获取网页游戏的HTML内容。

```java URL url = new URL("http://game-url.com"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String htmlContent = reader.readLine(); reader.close(); connection.disconnect(); ```

2. HTML解析:使用Jsoup或HTMLParser等库解析HTML,找到游戏元素的DOM对象。游戏句柄通常不会直接暴露在HTML中,可能需要查找特定的JavaScript代码或CSS类名来定位。

```java Document doc = Jsoup.parse(htmlContent); Element gameElement = doc.getElementById("game-handle"); // 假设游戏句柄的ID是"game-handle" ```

3. 模拟点击或发送事件:对于一些需要交互的网页游戏,可能需要模拟JavaScript事件(如点击、拖拽等)。这通常需要使用Selenium、WebDriver等自动化测试工具,或者使用JavaScriptExecutor接口的executeScript方法执行JavaScript代码。

```java // 使用Selenium WebDriver driver = new FirefoxDriver(); driver.get("http://game-url.com"); ((JavascriptExecutor) driver).executeScript("document.getElementById('game-handle').click();"); ```

请注意,这些方法可能因游戏的实现和安全性设置而有所不同。在实际操作时,你可能需要根据游戏的实际情况进行调整。同时,频繁的模拟操作可能会被服务器识别为机器人,导致IP被封禁,因此在使用时要遵守相关法律法规,尊重游戏规则。

就HotSpot而言,他使用的是直接指针访问方式进行对象访问,但从整个软件开发的范围来看,各种语言和框架使用句柄来访问的情况也十分常见。

如果使用该方式,Java堆对象的布局就必须考虑如何放置访问类型数据的相关信息,reference中直接存储的就是对象地址。使用直接指针方式最大的好处就是速度更快,他节省了一次指针定位的时间开销。

java如何拿到网页游戏句柄

由于reference类型在Java虚拟机规范里只规定了一个指向对象的引用,并没有定义这个引用应该通过哪种方式去定位,以及访问到Java堆中的对象的具体位置,因此不同虚拟机实现的对象访问方式会有所不同,主流的访问方式有两种:使用句柄和直接指针。

刚开始我们分配了一个句柄,它没有连接到任何对象,它就是null。在第二行,我们new了一个叫“张三”的person,将person指向“张三”这个对象,然后又指向了“李四”这个对象。也就是说,Person person,这句话只是声明了一个Person类的引用ipad网页游戏插件下载,它可以指向任何Person类的实例。

一个Vehicle类可以据此创建出无数个对象,这些对象不可能全叫“Vehicle”。对象连名都没有,没法直接访问它。我们只能通过对象引用来间接访问对象。Java中就是用句柄来标识每一个对象的.

左边的“Vehicle veh 1”创建了一个Vehicle类引用变量。所谓Vehicle类引用,就是以后可以用来指向Vehicle对象的对象引用。

末尾的()意味着,在对象创建后,立即调用Vehicle类的构造函数,对刚生成的对象进行初始化。构造函数是肯定有的。如果你没写,Java会给你补上一个默认的构造函数。

右边的“new Vehicle”,是以Vehicle类为模板,在堆空间里创建一个Vehicle类对象(也简称为Vehicle对象)。

句柄:一个唯一的整数,作为对象的身份id,区分不同的对象,和同类中的不同实例。程序可以通过句柄访问对象的部分信息。句柄不代表对象的内存地址。在Java中的任何东西都可以看做对象,存在一种标识符实际指向一个对象的句柄.在Java的其他地方或者数据中也有称为 "引用"或者 "指针". 只是一个引用地址,我们不能认为Java中没有指针,其实这就是一个指针,我们每次操作对象就是根据句柄去找到对象操作对象的. 即使没有对象,我们也可以让句柄单独存在。

FileUtils.copyFile(srcFile,new File("./screenshot.png"));

File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");

((JavascriptExecutor)driver).executeScript("window.scrollTo(100,450);");

System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");

System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");

deleteCookieNamed(String name):删除Cookie信息。 “name”是要删除的cookie的名称; “optionsString” 是该Cookie的选项,目前支持的选项包括“路径” , “域” 。

System.out.println("当前所有句柄:"+driver.getWindowHandles());

System.out.println("当前页面句柄:"+driver.getWindowHandle());

System.out.println("当前前端代码:"+driver.getPageSource());

System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");

driver.findElement(By.id("password")).sendKeys("123456");

System.out.println("元素的位置坐标:"+account.getLocation());

System.out.println("id属性的值:"+account.getAttribute("id"));

WebElement account=driver.findElement(By.id("account"));

System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");

driver.findElement(By.id("password")).sendKeys("123456");

WebElement account=driver.findElement(By.id("account"));

System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");

sendKeys(*value):该方法为输入方法,主要作用是模拟按键操作,比如输入文本、操作键盘上的某个按键、上传指定的文件。

driver.findElement(By.id("password")).sendKeys("123456");

driver.manage().window().setSize(new Dimension(1000,600));

System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");

WebDriverWait wait = new WebDriverWait(driver,10, 1);

driver.manage().timeouts().setScriptTimeout(5, TimeUnit.SECONDS);

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);

System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");

显式等待:显示等待要比强制等待,要智能的多,它可以针对于某个特定的元素设置的等待时间,它有两个参数:检测时间、最大等待时间,如果我们把检测时间设置为1s,最大等待时间设置为10s,也就意味着,每0.5s就会查找一下元素,只要一找到就立刻继续,不会继续等待,如果一直没找到,超过了最大的等待的时间,就会报错。

强制等待:强制等待,就是假如我在找某个元素之前,强制等待10s,但是,不管元素有没有加载好,都要等待10s才能继续,这样看起来不太智能,如果2s就加载好了,再继续等就会浪费时间,效率不高。

在做UI自动化的过程中,会因为种种原因,比如网络、页面加载快慢,导致元素并不能及时的获取到,这个时候,就需要我们使用元素等待,等待找到指定的元素,再进行下一步,一般等待分为三种:

System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");

System.setProperty("webdriver.chrome.driver", "/Users/yangchen/MyProject/SeleniumStudy/driver/chromedriver");

在说css样式选择器之前,我们这里先简单的说一下css,如果我们把元素的前端标签当成毛坯房的话,那么css就相当于给毛坯房装修的,我们这里以输入框做个简单的示例,前端代码如下:

该定位方法也是用的比价多的,xpath全称为XML Path的简称,他可以通过xpath的语法,定位到页面的每个元素,具体的语法我们就不铺开了,我们讲下使用,现在的浏览器开发者工具很方便,我们可以获取到xpath路径,如下图:

driver.findElements(By.tagName("input")).get(1).sendKeys("123456");

该方法就是通过元素的标签定位,在html页面中有很多标签元素,如:input、div、span、button等等,因此我们也可以使用标签来定位,关键代码如下: 前端页面代码

有的时候,他们既没有id也没有name,但是它有className,这个class不是编程中的类,它和id一样,也是前端元素的一种属性,与id不一样的是,id是唯一的,但是className是不唯一的。 前端页面代码

该方法与By.id方法类似,只不是通过name属性来定位的,有的时候,前端元素,它没有id,但是它有name,这个时候我们就可以使用name来定位。

该方法即使通过Web元素的id属性来定义,一般情况下如果元素有id,我们就使用id定义,因为id一般都是不重复的,定位准确,我们上面的示例中的元素定义就采用的id定位。

专题: 单机累三国游戏   单机游戏三国斩   猛三国单机游戏