Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript PhantomJS的行为与Firefox webdriver不同_Javascript_Python_Firefox_Selenium Webdriver_Phantomjs - Fatal编程技术网

Javascript PhantomJS的行为与Firefox webdriver不同

Javascript PhantomJS的行为与Firefox webdriver不同,javascript,python,firefox,selenium-webdriver,phantomjs,Javascript,Python,Firefox,Selenium Webdriver,Phantomjs,我正在编写一些使用SeleniumWeb驱动程序的代码——Firefox。大多数事情似乎都能正常工作,但当我尝试将浏览器更改为PhantomJS时,它的行为开始有所不同 我正在处理的页面需要慢慢滚动才能加载越来越多的结果,这可能就是问题所在 以下代码适用于Firefox webdriver,但不适用于PhantomJS: def get_url(destination,start_date,end_date): #the date is like %Y-%m-%d return "ht

我正在编写一些使用SeleniumWeb驱动程序的代码——Firefox。大多数事情似乎都能正常工作,但当我尝试将浏览器更改为PhantomJS时,它的行为开始有所不同

我正在处理的页面需要慢慢滚动才能加载越来越多的结果,这可能就是问题所在

以下代码适用于Firefox webdriver,但不适用于PhantomJS:

def get_url(destination,start_date,end_date): #the date is like %Y-%m-%d 
    return "https://www.pelikan.sk/sk/flights/listdfc=%s&dtc=C%s&rfc=C%s&rtc=%s&dd=%s&rd=%s&px=1000&ns=0&prc=&rng=0&rbd=0&ct=0&view=list" % ('CVIE%20BUD%20BTS',destination, destination,'CVIE%20BUD%20BTS', start_date, end_date)



def load_whole_page(self,destination,start_date,end_date):
        deb()

        url = get_url(destination,start_date,end_date)

        self.driver.maximize_window()
        self.driver.get(url)

        wait = WebDriverWait(self.driver, 60)
        wait.until(EC.invisibility_of_element_located((By.XPATH, '//img[contains(@src, "loading")]')))
        wait.until(EC.invisibility_of_element_located((By.XPATH,
                                                       u'//div[. = "Poprosíme o trpezlivosť, hľadáme pre Vás ešte viac letov"]/preceding-sibling::img')))
        i=0
        old_driver_html = ''
        end = False
        while end==False:
            i+=1

            results = self.driver.find_elements_by_css_selector("div.flightbox")
            print len(results)
            if len(results)>=__THRESHOLD__: # for testing purposes. Default value: 999
                break
            try:
                self.driver.execute_script("arguments[0].scrollIntoView();", results[0])
                self.driver.execute_script("arguments[0].scrollIntoView();", results[-1])            
            except:
                self.driver.save_screenshot('screen_before_'+str()+'.png')
                sleep(2)

                print 'EXCEPTION<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'
                continue 

            new_driver_html = self.driver.page_source
            if new_driver_html == old_driver_html:
                print 'END OF PAGE'
                break
            old_driver_html = new_driver_html

            wait.until(wait_for_more_than_n_elements((By.CSS_SELECTOR, 'div.flightbox'), len(results)))
        sleep(10)
def get_url(目的地、开始日期、结束日期):#日期类似于%Y-%m-%d
返回“https://www.pelikan.sk/sk/flights/listdfc=%s&dtc=C%s&rfc=C%s&rtc=%s&dd=%s&rd=%s&px=1000&ns=0&prc=&rng=0&rbd=0&ct=0&view=list“%('CVIE%20BUD%20BTS',目的地,目的地,'CVIE%20BUD%20BTS',开始日期,结束日期)
def加载整个页面(自身、目的地、开始日期、结束日期):
deb()
url=获取url(目的地、开始日期、结束日期)
self.driver.maximize_window()
self.driver.get(url)
wait=WebDriverWait(self.driver,60)
wait.until(位于((By.XPATH,//img[contains(@src,“load”)]'))的元素的EC.invisibility_)
wait.until(EC.invisibility)位于((By.XPATH,
u'//div[.=“Poprosíme o trpezlivosť,hľadáme pre Vás ešte viac letov”]/前面的兄弟姐妹::img'))
i=0
旧的\u驱动程序\u html=“”
结束=错误
当end==False时:
i+=1
结果=self.driver.find\u elements\u by\u css\u选择器(“div.flightbox”)
打印透镜(结果)
如果len(结果)>=uuuu阈值uuuu:#用于测试目的。默认值:999
打破
尝试:
self.driver.execute_脚本(“参数[0].scrollIntoView();”,结果[0])
self.driver.execute_脚本(“参数[0].scrollIntoView();”,结果[-1])
除:
self.driver.save_屏幕截图(“+str()+'.png'之前的屏幕_”)
睡眠(2)

打印异常帮助我解决它的两个关键问题:

  • 不要使用我以前帮过你的自定义等待
  • 窗口.document.body.scrollTop设置为0,然后设置为
    文档.body.scrollHeight
工作代码:

results = []
while len(results) < 200:
    results = driver.find_elements_by_css_selector("div.flightbox")

    print len(results)

    # scroll
    driver.execute_script("arguments[0].scrollIntoView();", results[0])
    driver.execute_script("window.document.body.scrollTop = 0;")
    driver.execute_script("window.document.body.scrollTop = document.body.scrollHeight;")
    driver.execute_script("arguments[0].scrollIntoView();", results[-1])
请注意,我已更改了
wait\u中的比较,以获得比元素多的元素。取代:

return count >= self.count
与:


版本3(从页眉到页脚滚动多次):


这对我不起作用。我试图使用你的代码:错误:这是最后一行的内容,但我认为结果[-1]必须存在,因为它说有10或15个结果…@millan好的,你使用的是哪个
PhantomJS
版本?如果不是最新版本,请尝试升级。谢谢。我查过了,它可能是最新的版本-2.0。0@Milan如果我错了,请纠正我:您基本上希望滚动结果列表,直到有N个结果,然后获取页面源代码,并使用
BeautifulSoup
对其进行解析?如果是,则检查
len(results)是否为>=n
,因为while循环中断应该足够好。@Milan在循环之前初始化一个新的
WebdriverWait
实例,并使用而不是
wait
。很高兴我们终于解决了:)
return count >= self.count
return count > self.count
header = wait.until(EC.visibility_of_element_located((By.TAG_NAME, 'header')))
footer = wait.until(EC.visibility_of_element_located((By.TAG_NAME, 'footer')))

results = []
while True:
    try:
        wait.until(wait_for_more_than_n_elements((By.CSS_SELECTOR, "div.flightbox"), len(results)))
    except TimeoutException:
        break

    results = self.driver.find_elements_by_css_selector("div.flightbox")
    print len(results)

    # scroll
    for _ in xrange(5):
        self.driver.execute_script("""
            arguments[0].scrollIntoView();
            arguments[1].scrollIntoView();
        """, header, footer)
        sleep(1)