自動検証でランダムにuGUIのボタンを押したいことがあります。シーン内のボタンは、
 Button [] list=GameObject.FindObjectsOfType<Button> ();
で取得できるのですが、Panelなど、他のオブジェクトの下にあるボタンも検出してしまうため、そのままでは使えません。

特定のボタンが押せるかどうか判定するには、ボタンからスクリーン座標を求め、EventSystemからRaycastし、自分自身かどうかで判定します。ボタンからスクリーン座標を求めるには、親キャンバスを取得した上で、RectTransformUtility.WorldToScreenPointを使用する必要があります。

private static bool IsButtonClickable(Button item){
        //親キャンバスを取得
        Transform target=item.transform;
        while(target.GetComponent<Canvas>()==null){
            target=target.parent;
            if(target==null){
                return false;
            }
        }

        //親キャンバスからスクリーン座標を求める
        Vector2 position=RectTransformUtility.WorldToScreenPoint(target.GetComponent<Canvas>().worldCamera,item.gameObject.GetComponent<RectTransform>().position);

        //スクリーン座標からRayを飛ばす
        PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
        eventDataCurrentPosition.position = position;
        List<RaycastResult> results = new List<RaycastResult>();
        EventSystem.current.RaycastAll(eventDataCurrentPosition, results);

        //自分自身でない場合は他のUIの下なのでタップできない
        if(results.Count >= 1){
            if(results[0].gameObject.name!=item.gameObject.name){
                return false;
            }
        }else{
            return false;
        }

        //タップできる
        return true;
    }