我在开始服用硒时遇到了问题。实际上我的线程类在run()方法中有selenium.start()。所以,当我使用下面的代码行时,
//some another class
class someclass{
ScrapeThread nidleThread = new ScrapeThread("nidleThread");
Thread scraper = new Thread(niidleThread);
scraper.start()
}
因为thread.start()方法在内部调用了run()方法,所以在线程类的run()方法中,只有前两行三行代码被执行,当它执行时会进入selenium.start()并执行,然后selenium在启动时给出问题我只能看到两个命令在selenium远程命令历史中执行,然后被击中。
但是当我使用下面的代码并直接调用我的线程类的run()方法
时//some another class
class someclass{
ScrapeThread nidleThread = new ScrapeThread("nidleThread");
nidleThread.run();
}
这里它正常工作,我正在按需要获得正确的输出。
当我以正常方式执行线程时,即通过调用scrapper.start()方法启动selenium会出现什么问题?
//in thread class
run(){
selenium = new DefaultSelenium(config.getHost(), Integer.parseInt(config.getPort()), config.getBrowser(), config.getUrl());
selenium.start();
}
线程类
的run()方法中的代码public void run(){
try {
System.out.println("in the run method");
scraper = siteToScrape.getSiteScraper();
scraper.setStartPageType(pageTypeToScrape);
scraper.setPageTypeToScrape(typeToScrape);
SocialParser parser = siteToScrape.getSiteParser();
selenium = new DefaultSelenium(config.getHost(), Integer.parseInt(config.getPort()), config.getBrowser(), config.getUrl());
selenium.start();
System.out.println("EXECUTED 1!!");//after this nothing is getting
//executed
Integer count = 0;
System.out.println("EXECUTED 2!!");
while (startUrl != null) {
System.out.println("EXECUTED 3!!");
HtmlPage homePage = new HtmlPage();
homePage.setCreatedBy(new String());
homePage.setCreatedon(new String());
homePage.setModifiedBy(new String());
homePage.setModifiedOn(new String());
homePage.setNoOfItemsFound(new String());
homePage.setOwnedBy(urlOwnedBy);
homePage.setPageType(scraper.getPageTypeToScrape());
homePage.setPageUrl(startUrl);
element = getInitialisedElement();
scraper.setNavigator(element.getNavigator());
scraper.setStartUrl(startUrl);
try {
scraper.initialize();//some more stuff
}catch (Exception e) {
e.printStackTrace();
}
答案 0 :(得分:1)
好吧,我假设你要做的是创建一个线程来使用selenium来执行一些页面抓取来驱动浏览器?如果是这样,我会确保你的selenium服务器配置是正确的,然后我还要确保selenium.start()不会与试图调用任何selenium命令的任何东西同时调用。
根据我的经验,在处理多个线程时你应该非常小心,好像我要做这样的事情:
Thread threadOne = new Thread(something);
Thread threadTwo = new Thread(somethingElse);
threadOne.start();
threadTwo.start();
这并不一定意味着threadOne将在threadTwo之前或与threadTwo完全同时启动。